27.简单的CheckBox+ListView解决复用问题

//-----------------------------------------先上效果图----------------------------------------

//1.---------------------第一步 写布局

//-------------------------这是Activity的布局

<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/mQuan"
            android:text="全选"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mFan"
            android:text="反选"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mQu"
            android:text="取消"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/mShan"
            android:text="删除"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

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

</LinearLayout>

//------------------------------再写一个item适配器条目的布局

//--------------写布局一定注意,CheckBox会阻断传向子控件的点击事件

//在xml最上面加一行

android:descendantFocusability="blocksDescendants"

//-------------------这样就不会阻断了

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="wrap_content"
    >

    <TextView
        android:layout_centerVertical="true"
        android:id="@+id/mText"
        android:layout_width="wrap_content"
        android:layout_height="60dp" />

    <CheckBox
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:id="@+id/mCheck"
        android:layout_width="wrap_content"
        android:layout_height="60dp" />
</RelativeLayout>

//2.---------------------第二步建立集合与适配器并适配---------------------------

//一个数据集合,一个Boolean类型的集合,默认都添加false

private List<String> mList;
private List<Boolean> mCheckList;
mList=new ArrayList<>();
mCheckList=new ArrayList<>();
for (int i = 0; i < 10; i++) {
    mList.add("WWW.baidu.COM");
    mCheckList.add(false);
}

//3.------------------------第三步 ListView适配器-------------------------------------

public class Apader extends BaseAdapter {

//构造方法
    private List<String> mList;
    private Context context;

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

//写个无参的方法,mList集合和mCheckList集合绑定到一起
    private List<Boolean> mCheckList;

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

    @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, null);
//把convertView传到ViewHolder里,最后返回一个viewholder,id都在viewholder里
        ViewHolder viewHolder=ViewHolder.getViewHolder(convertView);
//一条数据和一个复选框
        viewHolder.mCheck.setChecked(mCheckList.get(position));
        viewHolder.mText.setText(mList.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);
        }
//参数为convertView的公共静态方法,上面调用
        public static ViewHolder getViewHolder(View convertView) {
//一进来先从convertView取,如果没有,则走以下
         ViewHolder viewHolder= (ViewHolder) convertView.getTag();
//如果viewHolder为空则开始创建ViewHolder
            if (viewHolder==null){
                viewHolder=new ViewHolder(convertView);
//然后再给viewHolder赋上
                convertView.setTag(viewHolder);
            }
//最后返回一个viewHolder,布局id就都在viewholder里
            return viewHolder;
        }
    }
}

4.-------------------------------------第四步 返回Activity判断------------------------------------------

//适配器适配,并且通过apader调用适配器里写的setData()方法,里面放mList,mCheckList这两个集合,绑定到一起了

apader=new Apader(mList,this);
apader.setData(mList,mCheckList);
mListView.setAdapter(apader);

//ListView点击事件,点击那个让哪个条目的复选框和当前状态不一样,true为false,false为true
mListView.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.mQuan:
            QuanXuan();
            break;
        case R.id.mFan:
            FanXuan();
            break;
        case R.id.mQu:
            QuXiao();
            break;
        case R.id.mShan:
            ShanChu();
            break;
    }
}
//删除
private void ShanChu() {
    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();
}

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_42061754/article/details/81295136