[英]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.