如何从Acivity类中在Recycler View Adapters上设置OnClick侦听器?还是从第一个适配器访问其他RVAdapter?

时间:2019-08-06 13:04:56

标签: java android android-studio recycler-adapter

我有一个布局,其中我使用两个RecyclerView,每个都有自己的适配器。 在布局的Activity类中,我具有RV的引用,并在其中创建它们。然后,我动态创建按钮并将它们插入RecyclerViews之一。

我目前面临的问题是我在适配器本身内部设置了onClick侦听器,但我希望希望通过活动类进行设置。 这是因为活动类具有对单击“回收器”视图内的对象时需要知道的所有内容的引用,并且希望它们在单击时在RV之间移动。从第一个RV转到第二个,反之亦然。

要在我使用的第一个适配器中创建视图。

@Override
public void onBindViewHolder(LeftViewHolder holder,final int position) {

    holder.imageView.setImageResource(verticalLeftList.get(position).getLogo());
    holder.textView.setText(verticalLeftList.get(position).getName());
    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String productName = 
                verticalLeftList.get(position).getName().toString();
                Toast.makeText(context, productName + " is selected", 
                                       Toast.LENGTH_SHORT).show();
        }
    });
}

在适配器内部,我将OnBindViewHolder内的onclick侦听器设置为:

{{1}}

任何建议或帮助如何更改此设置以允许我做自己想做的事情,将不胜感激。寻找一种通过第一个适配器访问第二个适配器的方法,或者为活动类为RV中的每个项目设置侦听器的方法。

2 个答案:

答案 0 :(得分:0)

您可以为适配器创建回调,以将数据传递回活动。

public interface AdapterCallback {
void itemClicked(int position);
}

例如参见Juan's answer

答案 1 :(得分:0)

Activity作为回调侦听器传递到构造函数中的适配器,然后在onClick()方法中对活动调用回调。

(...)意味着还有更多与答案无关的代码。

在“ RV适配器”类中:

public MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
    Listener listener;

    public MyAdapter(Listener listener, ...){
        this.listener = listener;
        ...
    }

    @Override
    public void onBindViewHolder(LeftViewHolder holder,final int position) {

       holder.imageView.setImageResource(verticalLeftList.get(position).getLogo());
       holder.textView.setText(verticalLeftList.get(position).getName());
       holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
           public void onClick(View v) {
               String productName = 
                   verticalLeftList.get(position).getName().toString();
                   Toast.makeText(context, productName + " is selected", 
                                       Toast.LENGTH_SHORT).show();
                   listener.onClick(productName);
           }
       });
    }

    ...

    public static interface Listener{
        public void onRVClick(String aParamToIdWhatWasClicked);
    }
}

并使Activity实现Listener接口,并将其实例传递给RV Adapter构造函数。

public class MyActivity extends AppCompatActivity implements MyAdapter.Listener {
    private MyAdapter myRvAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState){
      ...
      myRvAdapter = new MyAapter(this, ...);
      ...
    }

    ...
    @Override 
    public void onRVClick(String what){
        System.out.println(what + " was selected");
    }
    ...
}

请注意,onRVClick()接口方法的参数可以是您想要的任何参数。甚至可能是支持所选回收者视图项目的数据列表项目。