ListView批量刪除數據

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>

大體的思路就是這樣,至於代碼精不精簡看個人。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章