从单击删除图像图标上的recyclerView中删除所选项目

时间:2017-11-03 17:43:50

标签: android android-recyclerview android-adapter

我想从recyclerView列表中删除所选项目。 在我的列表中,我已经删除了每一行的图像图标,并且我想在单击时删除项目删除图像图标。怎么办? 我的适配器代码这是看我的代码怎么做: 谢谢

 public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{

private Context context;
private List<Items> items=new ArrayList<>();

public ListAdapter(Context context){
    this.context=context;
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater=LayoutInflater.from(context);

        View view=layoutInflater.inflate(R.layout.item,parent,false);

    return new ItemViewHolder(view);
}

@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    holder.bindItem(items.get(position));
}

@Override
public int getItemCount() {

    return items.size();
}

public class ItemViewHolder extends RecyclerView.ViewHolder{
    private TextView titleTextView;
    private ImageView editIcon;
    private ImageView deleteIcon;

    public ItemViewHolder(View itemView) {
        super(itemView);
        titleTextView =itemView.findViewById(R.id.item_title);
        editIcon=itemView.findViewById(R.id.item_edit);
        deleteIcon=itemView.findViewById(R.id.item_delete);
    }

    public void bindItem(Items item){
        titleTextView.setText(item.getTitle());
    }

    public void removeItem(int position){
        items.remove(position);
        notifyItemRemoved(position);
    }
}

public void addItem(Items item){
    items.add(item);
    notifyItemInserted(items.size()-1);
}


}

3 个答案:

答案 0 :(得分:2)

尝试以下代码

public ItemViewHolder(View itemView) {
        super(itemView);
        titleTextView =itemView.findViewById(R.id.item_title);
        editIcon=itemView.findViewById(R.id.item_edit);
        deleteIcon=itemView.findViewById(R.id.item_delete);
        // put this code
        deleteIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeItem(getAdapterPosition())
            }
        });
    }

答案 1 :(得分:0)

我认为您应该再添加一个操作,以便删除该项目不会导致崩溃。将这样的代码放在removeItem(pos)方法中。

      <select name="mov_genre" id="mov_genre" class="form-control input-sm">
          <option value="">类型</option>
               @foreach(App\Genre::all() as $gData)
          <option value="{{$gData->gen_title}}">{{$gData->gen_title}}</option>
               @endforeach
      </select>

notifyItemRangeChanged(int positionStart,整数itemCount) 通知任何注册的观察者,从positionpositionStart开始的itemCount项目已更改。等效于调用notifyItemRangeChanged(position,itemCount,null);。这是项目变更事件,而不是结构变更事件。它表明在给定位置范围内数据的任何反映都已过时,应进行更新。给定范围内的项目保持相同的身份。

答案 2 :(得分:0)

上面的答案可以完成工作,但是使用接口回调总是更好的实现和代码模块化。以下是我想从活动中删除列表项的代码。在此方法中,您无需更改适配器类的代码,并且在需要进行更复杂的操作的情况下,例如:仅当从firebase数据库中删除元素时才删除list元素,此方法可以完美地完成此工作。 这是一个代码段

 new DeclinedClickListener() {
                    @Override
                    public void declinedClick(int position, View v) {
                        fbDB.getReference("news_requests").child(articles.get(position).getNewsID()).removeValue(new DatabaseReference.CompletionListener() {
                            @Override
                            public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                                articles.remove(position);
                                if(article_req_rv.getAdapter()!=null) {
                                    article_req_rv.getAdapter().notifyDataSetChanged();
                                }
                                                            }
                        });

您为此创建一个界面

public interface DeclinedClickListener {
    void declinedClick(int position, View v);
}

在recyclerview中使用此界面

 holder.declined_btx.setOnClickListener(l->{
            declinedClickListener.declinedClick(position,l);
        });