给大家详细介绍下用CheckBox实现删除,编辑,取消功能
原创请参考https://blog.youkuaiyun.com/lovelyliang/article/details/49080235
首先先看布局 也就是你的activity_ain.xml里面的布局
<ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" > </ListView> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" > <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="编辑" android:onClick="click_editButton" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="删除" android:onClick="click_deleteButton" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消" android:onClick="click_cancelButton" /> </LinearLayout>
这一步就是你的ManAcivity的代码
import android.content.Context; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; import android.widget.RadioGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView listview; private MyAdapter myAdapter; /**列表的数据源*/ private List<String> listData; /**记录选中item的下标*/ private List<Integer> checkedIndexList; /**保存每个item中的checkbox*/ private List<CheckBox> checkBoxList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initListData(); initView(); } public void initListData() { //静态赋值 listData = new ArrayList<String>(); for(int i=0;i<6;i++){ listData.add("item" + i); } } public void initView(){ listview = (ListView) findViewById(R.id.listview); myAdapter = new MyAdapter(getApplicationContext(), listData); listview.setAdapter(myAdapter); //监听listview的长按事件 listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //将checkbox设置为可见 for(int i=0;i<checkBoxList.size();i++){ checkBoxList.get(i).setVisibility(View.VISIBLE); } return false; } }); checkedIndexList = new ArrayList<Integer>(); checkBoxList = new ArrayList<CheckBox>(); } class MyAdapter extends BaseAdapter { private List<String> listData; private LayoutInflater inflater; public MyAdapter(Context context, List<String> listData){ this.listData = listData; inflater = LayoutInflater.from(context); } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int arg0) { return listData.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null){ viewHolder = new ViewHolder(); convertView = inflater.inflate(R.layout.list_item, null); viewHolder.tv = (TextView) convertView.findViewById(R.id.textview); viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox); //将item中的checkbox放到checkBoxList中 checkBoxList.add(viewHolder.checkbox); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.tv.setText(listData.get(position)); viewHolder.checkbox.setOnCheckedChangeListener(new CheckBoxListener(position)); return convertView; } class ViewHolder{ TextView tv; CheckBox checkbox; } } /**checkbox的监听器*/ class CheckBoxListener implements RadioGroup.OnCheckedChangeListener, CompoundButton.OnCheckedChangeListener { /**列表item的下标位置*/ int position; public CheckBoxListener(int position){ this.position = position; } @Override public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) { } @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b){ checkedIndexList.add(position); }else{ checkedIndexList.remove((Integer)position); } } } /**编辑按钮的点击事件*/ public void click_editButton(View v){ //将checkbox设置为可见 for(int i=0;i<checkBoxList.size();i++){ checkBoxList.get(i).setVisibility(View.VISIBLE); } } /**删除按钮的点击事件*/ public void click_deleteButton(View v){ //先将checkedIndexList中的元素从大到小排列,否则可能会出现错位删除或下标溢出的错误 checkedIndexList = sortCheckedIndexList(checkedIndexList); for(int i=0;i<checkedIndexList.size();i++){ //需要强转为int,才会删除对应下标的数据,否则默认删除与括号中对象相同的数据 listData.remove((int)checkedIndexList.get(i)); checkBoxList.remove(checkedIndexList.get(i)); } for(int i=0;i<checkBoxList.size();i++){ //将已选的设置成未选状态 checkBoxList.get(i).setChecked(false); //将checkbox设置为不可见 checkBoxList.get(i).setVisibility(View.INVISIBLE); } //更新数据源 myAdapter.notifyDataSetChanged(); //清空checkedIndexList,避免影响下一次删除 checkedIndexList.clear(); } /**取消按钮的点击事件*/ public void click_cancelButton(View v){ for(int i=0;i<checkBoxList.size();i++){ //将已选的设置成未选状态 checkBoxList.get(i).setChecked(false); //将checkbox设置为不可见 checkBoxList.get(i).setVisibility(View.INVISIBLE); } } /**对checkedIndexList中的数据进行从大到小排序*/ public List<Integer> sortCheckedIndexList(List<Integer> list){ int[] ass = new int[list.size()];//辅助数组 for(int i=0;i<list.size();i++){ ass[i] = list.get(i); } Arrays.sort(ass); list.clear(); for(int i=ass.length-1;i>=0;i--){ list.add(ass[i]); } return list; } }
这里边适配器写在了Manactivity为了CheckBox的实现删除的功能上面都有注释
自己好好看看。
最后适配器list_item的布局文件
<CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:visibility="invisible" /> <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#000000" android:layout_centerVertical="true" />结束。