关于Listview中长按删除

一. 先看效果图:

这里写图片描述
这里写图片描述
这里写图片描述

二. 需要关注的点

ListView 和CheckBox联合使用出现的问题:
  • checkbox抢占焦点使得listview的item条目不可点击,解决方法:
    • a. 设置checkbox的focusable=false;
    • b. 或者设置listview的 android:descendantFocusability="blocksDescendants"
  • 由于listvie的item条目复用的问题, 使得checkbox的一次点击多处条目处于checked或者unchecked的状态,解决方法:

    • a 将数据list中的对象,定义一个boolean类型的isChecked变量来控制
    • b 使用一个list将被点击的postion位置记录下来, 具体代码如下:
      // 点击checked时判断,如果checked就添加, 没有就删除
          holder.check.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          if (holder.check.isChecked()) {
      
                              selectId.add(position);
                              Log.d("tag","添加"+position);
                          }else{
                              //需要强制转化使用移除对象的方法
                              selectId.remove((Integer)position);
                          }
           //  设置checkbox的初始状态,默认都为false, 如果list中有就设置true
         holder.check.setChecked(false);
              if (selectId.contains(position)){
                  holder.check.setChecked(true);
              }

三. 具体xml布局文件

主界面布局:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:orientation="vertical"
                  android:layout_height="match_parent"
                  tools:context=".MainActivity">
        <ListView
            android:padding="20dp"
            android:scrollbars="none"
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="0dp"/>

        <RelativeLayout
            android:visibility="gone"
            android:id="@+id/rll_view"
            android:background="#22000000"
            android:layout_width="match_parent"
            android:layout_height="60dp">
            <ImageView
                android:id="@+id/btn_delete"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_centerInParent="true"
                android:scaleType="centerInside"
                android:src="@drawable/delete_selector"/>
        </RelativeLayout>
    </LinearLayout>
listview的item布局:
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                      android:layout_width="match_parent"
                      android:layout_height="60dp"
                      android:layout_margin="20dp"
                      android:orientation="horizontal">

            <TextView
                android:gravity="center_vertical"
                android:id="@+id/txtName"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:text=""
                android:textColor="#333"
                android:textSize="17sp"/>

            <CheckBox
                android:layout_gravity="center_vertical"
                android:background="@null"
                android:button="@drawable/checkbox_bj"
                android:scaleX="0.6"
                android:scaleY="0.6"
                android:id="@+id/check"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:clickable="false"
                android:visibility="gone"
                />
        </LinearLayout>

四. 逻辑代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ListView listview;
    private List<String> mContent = new ArrayList<>();
    private List<Integer> selectId = new ArrayList<>();
    private boolean isDeleteMode = false; //是否多选
    private Adapter adapter;
    private RelativeLayout layout;
    private ImageView delete;

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

    private void initView() {
        listview = (ListView) findViewById(R.id.list_view);
        layout = (RelativeLayout) findViewById(R.id.rll_view);
        delete = (ImageView) findViewById(R.id.btn_delete);
        adapter = new Adapter();
    }

    private void initDatas() {
        for (int i = 0; i < 20; i++) {
            mContent.add("美国打棒子犹如婊子偷汉子" + i);
        }
    }

    private void initEvent() {
        listview.setAdapter(adapter);
        delete.setOnClickListener(this);
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "被点击了", Toast.LENGTH_SHORT).show();
            }
        });
        listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                isDeleteMode = true;
                selectId.clear();
                layout.setVisibility(View.VISIBLE);
                return true;
            }
        });
    }


    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.btn_delete:
                isDeleteMode = false;
                Integer[] select = selectId.toArray(new Integer[selectId.size()]);
                Arrays.sort(select);
                for (int i = 0; i < select.length; i++) {
                    Log.d("tag",select[i]+"****************");
                }

                for (int i = select.length-1; i>=0 ; i--) {
                     mContent.remove((int)select[i]);
                    Log.d("tag","移除了"+select[i]);

                }
                selectId.clear();
                adapter.notifyDataSetChanged();
                layout.setVisibility(View.GONE);
                break;
            default:
                break;
        }

    }
    class Adapter extends BaseAdapter {
        private Context context;
        private LayoutInflater inflater = null;

        public int getCount() {
            return mContent.size();
        }

        public Object getItem(int position) {
            return mContent.get(position);
        }

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

        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(MainActivity.this, R.layout.item_list_view, null);
                holder = new ViewHolder();
                holder.content = (TextView) convertView.findViewById(R.id.txtName);
                holder.check = (CheckBox) convertView.findViewById(R.id.check);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            final String content = mContent.get(position);
            holder.content.setText(content);
            holder.check.setChecked(false);
            if (selectId.contains(position)){
                holder.check.setChecked(true);
            }
            if (isDeleteMode) {
                holder.check.setVisibility(View.VISIBLE);
            } else {
                holder.check.setVisibility(View.INVISIBLE);
            }
            holder.check.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (holder.check.isChecked()) {

                        selectId.add(position);
                        Log.d("tag","添加"+position);
                    }else{
                        //需要强制转化使用移除对象的方法
                        selectId.remove((Integer)position);
                    }
                    Log.d("tag",position+"被选中");
                }
            });

            return convertView;
        }

        class ViewHolder {
            TextView content;
            CheckBox check;
        }
    }
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值