简体   繁体   English

从 RecyclerView.ViewHolder 更新 RecyclerView.Adapter 的 ArrayList?

[英]Update ArrayList for RecyclerView.Adapter from RecyclerView.ViewHolder?

In my MainActivity I have something like this:在我的 MainActivity 我有这样的事情:

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

To update my RecyclerView, I do: (in MainActivity, too)为了更新我的 RecyclerView,我这样做:(也在 MainActivity 中)

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

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

I want to have a button within every RecyclerView list item which can enable/disable the current entry.我想在每个 RecyclerView 列表项中都有一个按钮,可以启用/禁用当前条目。 Therefore I need to get the current toggle state.因此我需要获取当前的切换状态。

My problem is, how can I update the RecyclerView in MainActivity from within my ViewHolder?我的问题是,如何从 ViewHolder 中更新 MainActivity 中的 RecyclerView? RecyclerView.ViewHolder: 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
    }
}

My Recycler.Adapter:我的 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;
}

} }

Define an Interface .定义一个Interface

public interface OnRecyclerItemToggleClickListener {

    void onToggleClick(int adapterPosition);
}

Implement this in your adapter .在您的adapter实现这一点。 And pass the adapter instance to the ViewHolder through a setter method in the onCreateViewHolder callback.并通过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);
    }
}

In your adapter:在您的适配器中:

@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.
}

And call this onToggleClick method from ViewHolder when the toggle is clicked.并在单击切换时从ViewHolder调用此onToggleClick方法。 You will get a callback to adapter , where you can update the ArrayList .您将收到对adapter的回调,您可以在其中更新ArrayList Otherwise you can have another similar Interface to give callback to Activity from the adapter.否则,您可以使用另一个类似的Interface从适配器向Activity提供回调。

You just have to add a static function and make items static too:您只需要添加一个静态函数并使项目也成为静态:

public static ArrayList<Items> getAreayList()
{
    return items;
}

And get this function in MainActivity :并在MainActivity获取此功能:

onStart()

暂无
暂无

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

相关问题 关于RecyclerView.ViewHolder和RecyclerView.Adapter - About RecyclerView.ViewHolder and RecyclerView.Adapter Kotlin:类型不匹配(RecyclerView.Adapter<RecyclerView.ViewHolder> ) - Kotlin: Type mismatch (RecyclerView.Adapter<RecyclerView.ViewHolder>) 类型不匹配,必需:(Recyclerview.Adapter<recyclerview.viewholder> ?..Recyclerview.Adapter&lt;*&gt;,找到:HomeAdapter</recyclerview.viewholder> - Type Mismatch , Required: (Recyclerview.Adapter<Recyclerview.ViewHolder>?..Recyclerview.Adapter<*> , found: HomeAdapter 从ViewHolder获取RecyclerView.Adapter列表 - Getting RecyclerView.Adapter List from ViewHolder "如何为 RecyclerView 适配器创建一个包装器,该包装器将接受任何实现 RecyclerView.Adapter 的适配器<RecyclerView.ViewHolder>" - How can I create a wrapper for the RecyclerView Adapter that will accept any Adapter that implements RecyclerView.Adapter<RecyclerView.ViewHolder> RecyclerView.ViewHolder的部分更新 - Partial update of RecyclerView.ViewHolder 从ViewHolder或ViewHolder的ViewModel访问RecyclerView.Adapter的方法 - access RecyclerView.Adapter's method from ViewHolder or ViewModel of ViewHolder 从适配器外部更改 RecyclerView.ViewHolder 布局 - Change RecyclerView.ViewHolder Layout from outside Adapter 如何从适配器外部访问Recyclerview.ViewHolder参数? - How to access Recyclerview.ViewHolder params from outside of adapter? 除了 RecyclerView.ViewHolder,如何引用适配器中的变量? - How to refer to the variable in adapter apart from RecyclerView.ViewHolder?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM