0

在我的MainActivity我有这样的事情:从RecyclerView.ViewHolder更新RecyclerView.Adapter的ArrayList?

recyclerAdapter = new RecyclerAdapter(this, arrayList); 
recyclerView.setAdapter(recyclerAdapter); 

更新我RecyclerView,我做的:(在MainActivity,太)

Item item = new Item(); 
item.setId(id); 
item.setMessage(message); 

arrayList.set(position, item); 
recyclerAdapter.notifyItemChanged(position); 

我想有每RecyclerView列表项内的按钮可以启用/禁用当前条目。因此我需要获得当前的切换状态。

我的问题是,我如何更新我的ViewHolder中的MainActivity的RecyclerView? RecyclerView.ViewHolder:

public class SetViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{//, View.OnLongClickListener{ 
public ImageView toggle; 

public SetViewHolder(View itemView){ 
    super(itemView); 
    toggle = (ImageView) itemView.findViewById(R.id.img_main_card_toggle); 
    toggle.setOnClickListener(this); 
} 


@Override 
public void onClick(View v) { 
    if (v.getId() == toggle.getId()) { 
     int clicked_position = getAdapterPosition(); 
     //TODO update Item of RecyclerView of MainActivity 
    } 
} 

我Recycler.Adapter:

public class RulesAdapter extends RecyclerView.Adapter<SetViewHolder>{ 
private Activity activity; 
List<Item> items = Collections.emptyList(); 
private OnTapListener onTapListener; 
public RulesAdapter(Activity activity, List<Item> items){ 
    this.activity = activity; 
    this.items = items; 
} 

@Override 
public SetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rules_list_item,parent,false); 
    return new SetViewHolder(view); 
} 

@Override 
public void onBindViewHolder(SetViewHolder holder, final int position) { 
    holder.recevied_message.setText(items.get(position).getReceived_message()); 
    holder.reply_message.setText(items.get(position).getReply_message()); 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(onTapListener != null){ 
       onTapListener.OnTapView(position); 
      } 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 

public void setOnTapListener(OnTapListener onTapListener){ 
    this.onTapListener = onTapListener; 
} 

}

+0

从'ViewHolder'调用'notifyItemChanged' –

+0

如果你在MainActivity中添加一个item到arrayList并且调用了notifyItemChanged(),我认为它不会显示在recyclerview中。您可能想要更新适配器 –

+0

中使用的arrayList但是如何从我的ViewHolder更新ArrayList?我如何访问它? – Panther

回答

1

定义一个Interface

public interface OnRecyclerItemToggleClickListener { 

    void onToggleClick(int adapterPosition); 
} 

在您的adapter中执行此操作。并通过onCreateViewHolder回调中的setter方法将适配器实例传递给ViewHolder

public class SetViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{//, View.OnLongClickListener{ 
    public ImageView toggle; 
    private OnRecyclerItemToggleClickListener listener; 

    public SetViewHolder(View itemView){ 
     super(itemView); 
     toggle = (ImageView) 
     itemView.findViewById(R.id.img_main_card_toggle); 
     toggle.setOnClickListener(this); 
    } 


    public void setRecyclerItemToggleClickListener(OnRecyclerItemToggleClickListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == toggle.getId()) { 
      int clicked_position = getAdapterPosition(); 


     //TODO update Item of RecyclerView of MainActivity 

     listener.onToggleClick(clicked_position); 
    } 
} 

在您的适配器:

@Override 
public SetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rules_list_item,parent,false); 
    SetViewHolder holder = new SetViewHolder(view); 
    holder.setOnRecyclerItemToggleClickListener(this); 
    return holder; 
} 

@Override public void onToggleClick(int adapterPosition) { 
    // you will get the callback here when the toggle button is clicked. 
    // you can update the ArrayList here. 
    // Or similarly, call an interface method to Activity. 
} 

,并点击切换时从ViewHolder调用此方法onToggleClick。您将收到adapter的回拨,您可以在此更新ArrayList。否则,您可以使用另一个类似的Interface从适配器回拨至Activity

+0

我不明白。你能详细解释一下吗?我该如何调用这个onClick方法,然后该怎么做? – Panther

+0

我在答案中添加了更多代码。 – Bob