5.android listview 里写了CheckBok 点击事件冲突+ListView嵌套CheckBok实现全选,单选,反选,取消,删除的操作

本文介绍了一种在Android中使用ListView结合Checkbox实现全选、反选、取消选择及删除等功能的方法,并解决了焦点传递问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于listview 里写了CheckBok 点击事件不好用了的问题,原因是焦点传递到了子控件。
导致别的控件没焦点,只有checkbok有。
解决办法是在xml最外层里加一个阻止焦点传递到子控件的代码
<!--阻止焦点向子控件传递    android:descendantFocusability="blocksDescendants"  -->

 

 //ListView嵌套CheckBok实现全选,单选,反选,取消,删除的操作:

//效果图: 

 

//第一步 我的Activity布局:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/mQuanXuan"
            android:text="全选"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mFanXuan"
            android:text="反选"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mQuXiao"
            android:text="取消"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mShanChu"
            android:text="删除"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <ListView
        android:id="@+id/mLV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
    
</LinearLayout>

//第二步 在Activity里具体代码实现:

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mQuanXuan;
    private Button mFanXuan;
    private Button mQuXiao;
    private Button mShanChu;
    private ListView mLV;

    private List<String> mList;
    private List<Boolean> mChecklist;
    private Apader apader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initApader();
    }

    private void initView() {
        mQuanXuan = (Button) findViewById(R.id.mQuanXuan);
        mFanXuan = (Button) findViewById(R.id.mFanXuan);
        mQuXiao = (Button) findViewById(R.id.mQuXiao);
        mShanChu = (Button) findViewById(R.id.mShanChu);
        mLV = (ListView) findViewById(R.id.mLV);

        mQuanXuan.setOnClickListener(this);
        mFanXuan.setOnClickListener(this);
        mQuXiao.setOnClickListener(this);
        mShanChu.setOnClickListener(this);
    }

    private void initData() {
        mList = new ArrayList<String>();
        mChecklist = new ArrayList<Boolean>();
        for (int i = 0; i < 20; i++) {
            mList.add("奔波儿灞" + i);
            mChecklist.add(false);
        }
    }

    private void initApader() {
        apader = new Apader(mList, MainActivity.this);
        apader.setData(mList, mChecklist);
        mLV.setAdapter(apader);

        mLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                mChecklist.set(position, !mChecklist.get(position));
                apader.setData(mList, mChecklist);
                apader.notifyDataSetChanged();
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mQuanXuan:
                select_all();
                break;
            case R.id.mFanXuan:
                un_select();
                break;
            case R.id.mQuXiao:
                cancel();
                break;
            case R.id.mShanChu:
                delete();
                break;
        }
    }

    //全选
    private void select_all() {
        for (int i = 0; i < mChecklist.size(); i++) {
            mChecklist.set(i, true);
        }
        apader.setData(mList, mChecklist);
        apader.notifyDataSetChanged();
    }

    //反选
    private void un_select() {
        for (int i = 0; i < mChecklist.size(); i++) {
            mChecklist.set(i, !mChecklist.get(i));
        }
        apader.setData(mList, mChecklist);
        apader.notifyDataSetChanged();
    }

    //取消
    private void cancel() {
        for (int i = 0; i < mChecklist.size(); i++) {
            if (mChecklist.get(i)) {
                mChecklist.set(i, false);
            }
        }
        apader.setData(mList, mChecklist);
        apader.notifyDataSetChanged();
    }

    //删除
    private void delete() {
        for (int i = 0; i < mChecklist.size(); i++) {
            if (mChecklist.get(i)) {
                mChecklist.remove(i);
                mList.remove(i);
                i--;
            }
        }
        apader.setData(mList, mChecklist);
        apader.notifyDataSetChanged();
    }

}

//第三步 我的ListView适配器:

 

public class Apader extends BaseAdapter {
    private List<String> mList;
    private Context context;
    private List<Boolean> mCheckList;

    public void setData(List<String> mList, List<Boolean> mCheckList) {
        this.mList = mList;
        this.mCheckList = mCheckList;
    }

    public Apader(List<String> mList, Context context) {
        this.mList = mList;
        this.context = context;
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, null);
        ViewHolder viewHolder=ViewHolder.getViewHolder(convertView);
        viewHolder.mText.setText(mList.get(position));
        viewHolder.mCheck.setChecked(mCheckList.get(position));
        viewHolder.mCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mCheckList.set(position,isChecked);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }


    public static class ViewHolder {
        public View rootView;
        public TextView mText;
        public CheckBox mCheck;

        public ViewHolder(View rootView) {
            this.rootView = rootView;
            this.mText = (TextView) rootView.findViewById(R.id.mText);
            this.mCheck = (CheckBox) rootView.findViewById(R.id.mCheck);
        }

        public static ViewHolder getViewHolder(View convertView) {
            ViewHolder viewHolder = (ViewHolder) convertView.getTag();
            if (viewHolder==null){
                viewHolder=new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            }
            return viewHolder;
        }
    }
}

//第四步 我的ListView适配器布局:记得要加android:descendantFocusability="blocksDescendants"

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="100dp">

        <TextView
            android:id="@+id/mText"
            android:textSize="20sp"
            android:textStyle="bold"
            android:layout_marginLeft="10dp"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <CheckBox
            android:id="@+id/mCheck"
            android:layout_marginRight="10dp"
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
    </RelativeLayout>

</LinearLayout>

//-----------------------------------------------------------------------完-------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值