简体   繁体   English

删除recyclerView中的所有选定项目

[英]Deleting all selected items in recyclerView

I am trying to delete multiple items from recyclerView. 我正在尝试从recyclerView删除多个项目。 The items in the recyclerView has an attribute isSelected . recyclerView中的项目具有isSelected属性。 I am setting the attribute isSelected to true when user clicks on the recyclerView item. 当用户单击recyclerView项时,我将属性isSelected设置为true After selection user can click delete button present in the options menu to delete the selected items. 选择后,用户可以单击选项菜单中的“ delete按钮删除所选项目。 The code has unexpected behaviour, like when delete button is pressed, some of the selected items are deleted while some are not. 该代码具有异常行为,例如,当按下delete按钮时,某些选定项将被删除,而某些则未被删除。 Also some of the items get automatically selected at random positions. 另外,某些项目会在随机位置自动选择。

Model.java 模型

public class Model {
    private String text;
    private boolean isSelected = false;

    public Model(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }


    public boolean isSelected() {
        return isSelected;
    }
}

RecyclerViewAdapter.java RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private List<Model> mModelList;
    private Context mCtx;

    public RecyclerViewAdapter(Context ctx, List<Model> modelList) {
        this.mModelList = modelList;
        this.mCtx = ctx;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.item_row, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final Model model = mModelList.get(position);
        holder.view.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
        holder.tvItems.setText(model.getText());
        holder.tvItems.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                model.setSelected(!model.isSelected());
                holder.tvItems.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
                notifyItemChanged(position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mModelList == null ? 0 : mModelList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tvItems;
        private View view;

        public MyViewHolder(View itemView) {
            super(itemView);
            view = itemView;
            tvItems = itemView.findViewById(R.id.tvItems);
        }
    }
}

MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity {

    private List<Model> mModelList;
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;

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

        mRecyclerView = (RecyclerView) findViewById(R.id.rvListItems);
        mAdapter = new RecyclerViewAdapter(this, getListData());
        LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);
    }

    private List<Model> getListData() {
        mModelList = new ArrayList<>();
        for (int i = 1; i <= 25; i++) {
            mModelList.add(new Model("TextView " + i));
        }
        return mModelList;
    }


    private void deleteSelectedItems() {
        if (mModelList != null){
            for (int i=0; i<mModelList.size(); i++){
                if (mModelList.get(i).isSelected()){
                    Log.d("testingTAG", String.valueOf(i));
                    mModelList.remove(i);
                    mAdapter.notifyItemRemoved(i);
                    mAdapter.notifyItemRangeChanged(i, mModelList.size());
                    i--;
                }
            }
        }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_delete:
                deleteSelectedItems();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Any kind of help will be greatly appreciated. 任何帮助将不胜感激。

You should use holder.getAdapterPosition() inside your clicklistener .Change your onclick as given below and try. 您应该在clicklistener中使用holder.getAdapterPosition()。按如下所示更改onclick并尝试。

public void onClick(View view) {
                final Model model = mModelList.get(holder.getAdapterPosition());
                model.setSelected(!model.isSelected());
                holder.tvItems.setBackgroundColor(model.isSelected() ? Color.CYAN : Color.WHITE);
                notifyItemChanged(holder.getAdapterPosition());
            }

Answer from @pop selects items, change background color to CYAN if item is selected and inverse selected flag of Model class instance. 来自@pop的答案选择了项目,如果选择了项目,则将背景色更改为CYAN,并反选了Model类实例的选定标志。

you should delete selected items from your mModelList using a iterator, you can't delete items from list inside for loop 您应该使用迭代器从mModelList中删除所选项目,而不能从for循环中的列表中删除项目

Calling remove in foreach loop in Java 在Java中的foreach循环中调用remove

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM