ListView批量删除数据

来源:互联网 发布:聊天机器人软件下载 编辑:程序博客网 时间:2024/06/07 00:11

ListView批量删除数据

    批量删除数据特别常见,写了个简单的demo。思路是利用CheckBox标记ListView的item,然后进行批量删除。代码如下:

1、布局:
activity_main:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/public_layout_ii"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical">    <RelativeLayout        android:id="@+id/edit_bar"        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="#fbfbf4"        android:padding="5dp">        <CheckBox            android:id="@+id/check_all"            android:layout_width="60dp"            android:layout_height="match_parent"            android:background="@drawable/edit_button_bg"            android:button="@null"            android:gravity="center"            android:text="全选"            android:visibility="gone" />        <Button            android:id="@+id/btn_delete"            android:layout_width="60dp"            android:layout_height="match_parent"            android:layout_marginRight="10dp"            android:layout_toLeftOf="@+id/cb_edit"            android:background="@drawable/edit_button_bg"            android:text="删除"            android:visibility="gone" />        <CheckBox            android:id="@+id/cb_edit"            android:layout_width="60dp"            android:layout_height="match_parent"            android:layout_alignParentRight="true"            android:background="@drawable/edit_button_bg"            android:button="@null"            android:gravity="center"            android:text="编辑" />    </RelativeLayout>    <ListView        android:id="@+id/listView"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>
item_layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/llRoot"    android:layout_width="match_parent"    android:layout_height="50dp"    android:orientation="horizontal"    android:padding="2dp">    <CheckBox        android:id="@+id/check_box"        android:layout_width="40dp"        android:layout_height="match_parent"        android:layout_marginLeft="5dp"        android:gravity="center"        android:visibility="gone" />    <TextView        android:id="@+id/tvName"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:gravity="center_vertical"        android:paddingLeft="10dp"        android:textColor="#000" /></LinearLayout>

2、适配器:
public class ListViewAdapter extends BaseAdapter {    private Context context;    private ArrayList<String> data;    private ArrayList<Boolean> state;    private LayoutInflater inflate;    private boolean visibilityFlag;    public ListViewAdapter(Context context, ArrayList<Boolean> state, ArrayList<String> data) {        this.context = context;        this.data = data;        this.state = state;        inflate = LayoutInflater.from(context);    }    public void setVisibilityFlag(boolean visibilityFlag) {        this.visibilityFlag = visibilityFlag;        notifyDataSetChanged();    }    public void setData(ArrayList<String> data) {        this.data = data;        notifyDataSetChanged();    }    public void setState(ArrayList<Boolean> state) {        this.state = state;        notifyDataSetChanged();    }    @Override    public int getCount() {        return data == null ? 0 : data.size();    }    @Override    public Object getItem(int position) {        return null;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        Holder holder;        if (convertView == null) {            convertView = inflate.inflate(R.layout.item_layout, parent, false);            holder = new Holder(convertView);            convertView.setTag(holder);        } else {            holder = ((Holder) convertView.getTag());        }        final String str = data.get(position);        if (!TextUtils.isEmpty(str)) {            holder.tvName.setText(str);            holder.check_box.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (clickListener != null) {                        clickListener.itemClickIsCheckedListener(str);                    }                }            });            if (visibilityFlag) {                holder.check_box.setVisibility(View.VISIBLE);            } else {                holder.check_box.setVisibility(View.GONE);            }            if (state != null && state.size() > 0) {                if (state.get(position)) {                    holder.check_box.setChecked(true);                } else {                    holder.check_box.setChecked(false);                }            }        }        return convertView;    }    class Holder {        TextView tvName;        LinearLayout llRoot;        CheckBox check_box;        public Holder(View view) {            tvName = (TextView) view.findViewById(R.id.tvName);            llRoot = (LinearLayout) view.findViewById(R.id.llRoot);            check_box = (CheckBox) view.findViewById(R.id.check_box);        }    }    ClickListener clickListener;    public void setClickListener(ClickListener clickListener) {        this.clickListener = clickListener;    }    public interface ClickListener {        void itemClickIsCheckedListener(String str);    }}

3、MainActivity:
public class MainActivity extends AppCompatActivity implements ListViewAdapter.ClickListener {    private Button delete;    private CheckBox edit;    private CheckBox all;    private ListView listView;    private ArrayList<String> data;    private ArrayList<String> selectData;    private ArrayList<Boolean> state;    private ListViewAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();        initAdapter();    }    private void initAdapter() {        adapter = new ListViewAdapter(this, state, data);        adapter.setClickListener(this);        listView.setAdapter(adapter);    }    private void initView() {        delete = ((Button) findViewById(R.id.btn_delete));        edit = ((CheckBox) findViewById(R.id.cb_edit));        all = ((CheckBox) findViewById(R.id.check_all));        listView = ((ListView) findViewById(R.id.listView));        all.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (all.isChecked()) {                    Collections.replaceAll(state, false, true);                } else {                    Collections.replaceAll(state, true, false);                }                adapter.setState(state);            }        });        edit.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (edit.isChecked()) {                    all.setVisibility(View.VISIBLE);                    delete.setVisibility(View.VISIBLE);                    adapter.setVisibilityFlag(true);                } else {                    all.setVisibility(View.GONE);                    delete.setVisibility(View.GONE);                    adapter.setVisibilityFlag(false);                }            }        });        delete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (state.indexOf(false) == -1) {                    data.removeAll(data);                    state.removeAll(state);                } else {                    removeData();                }                adapter.setData(data);                adapter.setState(state);            }        });    }    private void removeData() {        for (int i = 0; i < state.size(); i++) {            if (state.get(i)) {  //如果被选中则把该条数据添加到selectData集合中                selectData.add(data.get(i));            }        }        for (int j = 0; j < selectData.size(); j++) {            for (int i = 0; i < data.size(); i++) {                if (data.get(i) != null) {                    if (selectData.get(j) == data.get(i)) {                        data.set(i, null);//把被选中的数据设置为null                    }                }            }        }        for (int i = 0; i < data.size(); i++) {            if (data.get(i) == null) {//对为null的数据删除                data.remove(i);                i--;            }        }        for (int i = 0; i < state.size(); i++) {            if (state.get(i)) {                state.remove(i);//把对应的标记删除                i--;            }        }    }    private void initData() {        data = new ArrayList<>();        for (int i = 0; i < 20; i++) {            data.add("NAME_" + i);        }        state = new ArrayList<>();        for (int i = 0; i < data.size(); i++) {            state.add(false);        }        selectData = new ArrayList<>();    }    @Override    public void itemClickIsCheckedListener(String str) {        for (int i = 0; i < data.size(); i++) {            if (data.get(i).equals(str)) {                if (state.get(i)) {                    state.set(i, false);                } else {                    state.set(i, true);                }            }        }        adapter.setState(state);    }}

控件的背景
<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/text_bg_i"        android:state_pressed="true"/>    <item android:drawable="@drawable/text_bg_ii"/></selector>

大体的思路就是这样,至于代码精不精简看个人。





原创粉丝点击