从列表视图中删除选定的动态选中项

时间:2016-12-19 12:57:36

标签: android listview checkbox

此处,在列表视图中,我添加了一个自定义行,CheckboxEditText在那里,并且add按钮我添加了多个视图到我的 listview 。添加工作正常,但是当涉及删除部分时,已检查的项目不会被删除,除此之外,假设我选择了两个项目,然后是上次删除的两个项目。我不知道我的代码会怎样,请帮帮我。

这是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {

AdapterCustom customAdapter;
ArrayList<String> stringArrayList;
ListView listView;
ArrayList<Integer> listOfItemsToDelete;
AdapterCustom.ViewHolder item;
int POS;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listOfItemsToDelete = new ArrayList<Integer>();
    stringArrayList = new ArrayList<String>();
    LinearLayoutManager layoutManager
            = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    listView = (ListView) findViewById(R.id.list_item);
    customAdapter = new AdapterCustom(MainActivity.this, R.layout.main, stringArrayList);
}

public void addItems(View v) {
    stringArrayList.add("");
    listView.setAdapter(customAdapter);
    customAdapter.notifyDataSetChanged();
}

public void removeItems(View v) {

    if (listOfItemsToDelete.isEmpty()) {

        Toast.makeText(getBaseContext(), "No items selected.",
                Toast.LENGTH_SHORT).show();
    } else {

        Log.i("Delete Pos", POS + "");

        if (!listOfItemsToDelete.equals("")) {
            for (int j = 0; j < listOfItemsToDelete.size(); j++) {
                stringArrayList.remove(listOfItemsToDelete.get(j) - j);
                customAdapter.notifyDataSetChanged();
            }
        }
    }

}

AdapterCustom.java

public class AdapterCustom extends ArrayAdapter<String> {

    Context context;
    ArrayList<String> stringArrayList;


    ArrayList<Boolean> positionArray;
    MainActivity activity;


    public AdapterCustom(Context context, int resourceId, ArrayList<String> arrayList) {
        super(context, resourceId, arrayList);
        this.context = context;
        this.stringArrayList = arrayList;
        positionArray = new ArrayList<Boolean>(stringArrayList.size());
        for (int i = 0; i < stringArrayList.size(); i++) {
            positionArray.add(false);
        }
        activity = new MainActivity();

    }

    @Override
    public int getCount() {
        return stringArrayList.size();
    }

    @Override
    public String getItem(int position) {
        return stringArrayList.get(position);
    }

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

    public class ViewHolder {
        EditText ediText;
        CheckBox checkBox;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {


        if (convertView == null) {
            item = new ViewHolder();

            convertView = LayoutInflater.from(context).inflate(R.layout.main, null);

            item.ediText = (EditText) convertView.findViewById(R.id.ediText);
            item.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
            item.checkBox.setTag(new Integer(position));
            convertView.setTag(item);
            final View finalConvertView1 = convertView;
            item.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                    if (b) {
                        int getPosition = (Integer) compoundButton.getTag();
                        POS = getPosition;
                        listOfItemsToDelete.add(POS);
                        Log.i("position after check", POS + "");
                        Log.i("position check array", listOfItemsToDelete + "");
                    }
                }
            });
        } else {
            item = (ViewHolder) convertView.getTag();
        }

        item.checkBox.setTag(position);
        return convertView;
    }

}

activity_main.xml中

 <LinearLayout 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="10">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:weightSum="10">
    <Button
        android:id="@+id/addBtn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="5"
        android:onClick="addItems"
        android:text="Add New Item" />
    <Button
        android:id="@+id/goBtn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="5"
        android:onClick="goItems"
        android:text="Go to Item" />
</LinearLayout>
<ListView
    android:id="@+id/list_item"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="8"
    android:drawSelectorOnTop="false"
    android:visibility="visible" />
<Button
    android:id="@+id/removeBtn"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:onClick="removeItems"
    android:text="Remove Item" />
</LinearLayout>

main.xml

<LinearLayout 
android:id="@+id/custom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp"
android:weightSum="10">

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

<EditText
    android:id="@+id/ediText"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="9"
    android:background="@android:color/white"
    android:hint="Type Anything You Want" />
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

您只能从数组中删除该项目。尝试使用adapter.remove(itemPosition);

从列表视图适配器中删除该项目

答案 1 :(得分:0)

意味着什么

 - j

在此代码中:

 for (int j = 0; j < listOfItemsToDelete.size(); j++) {
            stringArrayList.remove(listOfItemsToDelete.get(j) - j);
            customAdapter.notifyDataSetChanged();
        }

我认为:

    for (String itemToRemove:listOfItemsToDelete) {
        stringArrayList.remove(itemToRemove);
    }

    customAdapter.notifyDataSetChanged();
    listOfItemsToDelete.clear();

是合适的。