关于listview的全选、反选、取消、删除等操作

一般listview的每个item都有点击事件,一个item一个点击事件是没有问题的。

当一个item中出现多个点击效果时,并且还要保留item的点击效果,我们该怎么处理呢?

这时我们需要用到这个属性(一般写在item的布局上)

这个属性的作用就是:阻止焦点向子控件传递。

android:descendantFocusability="blocksDescendants"

单个控件时使用:

android:focusable="false"

这个需要注意一下,Demo如下:

Activity布局:

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">
        <Button
            android:id="@+id/mBt_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全选"
            android:onClick="onClick"
            android:textColor="#0000ff"
            android:background="@color/colorAccent"
            android:layout_weight="1"
            android:layout_margin="5dp"
            />
        <Button
            android:id="@+id/mBt_un_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="反选"
            android:onClick="onClick"
            android:textColor="#0000ff"
            android:background="@color/colorAccent"
            android:layout_weight="1"
            android:layout_margin="5dp"
            />
        <Button
            android:id="@+id/mBt_cancle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消"
            android:onClick="onClick"
            android:textColor="#0000ff"
            android:background="@color/colorAccent"
            android:layout_weight="1"
            android:layout_margin="5dp"
            />
        <Button
            android:id="@+id/mBt_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="删除"
            android:onClick="onClick"
            android:textColor="#0000ff"
            android:background="@color/colorAccent"
            android:layout_weight="1"
            android:layout_margin="5dp"
            />
    </LinearLayout>

    <ListView
        android:id="@+id/mListView"
        android:overScrollMode="never"
        android:divider="@color/colorAccent"
        android:dividerHeight="0.1dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

item布局:

<RelativeLayout 
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:descendantFocusability="blocksDescendants"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp">

    <TextView
        android:id="@+id/mTe_item"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_margin="5dp"
        android:layout_centerVertical="true"
        />
    <CheckBox
        android:id="@+id/mCb_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        />

</RelativeLayout>

完整代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<String> list;
    private List<Boolean> checks;
    private ListView listView;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.mListView);
//     添加数据
        initData();
    }

    private void initData() {
        list = new ArrayList<>();
        checks = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            list.add("数据"+i);
            checks.add(false);
        }
        adapter = new MyAdapter(this, list);
        adapter.setData(list, checks);
        listView.setAdapter(adapter);

//        条目点击
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "item点击了", Toast.LENGTH_SHORT).show();
                checks.set(position, !checks.get(position));
                adapter.setData(list, checks);
                adapter.notifyDataSetChanged();
            }
        });

    }
//       按钮点击
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.mBt_all:
                select_All();
                break;
            case R.id.mBt_un_all:
                select_UnAll();
                break;
            case R.id.mBt_cancle:
                select_cancle();
                break;
            case R.id.mBt_delete:
                select_delete();
                break;
        }
    }

    //      删除
    private void select_delete() {
        for (int i = 0; i < checks.size(); i++) {
//            判断是否选中,清除多选按钮,数据,以及索引
            if (checks.get(i)) {
                checks.remove(i);
                list.remove(i);
                i--;
            }
            adapter.setData(list, checks);
            adapter.notifyDataSetChanged();
        }
    }

    //  取消
    private void select_cancle() {
        for (int i = 0; i < checks.size(); i++) {
            checks.set(i, false);
        }
        adapter.setData(list, checks);
        adapter.notifyDataSetChanged();
    }

    //  反选
    private void select_UnAll() {
        for (int i = 0; i < checks.size(); i++) {
            checks.set(i, !checks.get(i));
        }
        adapter.setData(list, checks);
        adapter.notifyDataSetChanged();
    }

    //全选
    private void select_All() {
        for (int i = 0; i < checks.size(); i++) {
            checks.set(i, true);
        }
        adapter.setData(list, checks);
        adapter.notifyDataSetChanged();
    }
}

Adapter:

public class MyAdapter extends BaseAdapter {
    private Context mContext;
    private List<String> mList;
    private List<Boolean> checks;
    public MyAdapter(Context mContext, List<String> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }

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

    @Override
    public int getCount() {
        return mList==null?0:mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
            convertView= View.inflate(mContext,R.layout.layout_listeitem,null);
        ViewHolder viewHolder = ViewHolder.getViewHolder(convertView);
        viewHolder.textView.setText(mList.get(position));
        viewHolder.checkBox.setChecked(checks.get(position));

        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                checks.set(position,isChecked);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }

    static class ViewHolder{
        private TextView textView;
        private CheckBox checkBox;

        public ViewHolder(View convertView){
            textView=convertView.findViewById(R.id.mTe_item);
            checkBox=convertView.findViewById(R.id.mCb_item);
        }

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

    }

猜你喜欢

转载自blog.csdn.net/csdn15002274757/article/details/81130139
今日推荐