繁体   English   中英

如何在构造函数中传递 Recycler 视图适配器?

[英]How to pass a Recycler view adapter in a constructor?

假设我有三个这样的适配器,每个适配器都定义了一个接口,即 ClickListener,它有一个 onItemClick 方法。

public class SearchResultAdapter extends RecyclerView.Adapter<SearchResultAdapter.searchResultViewHolder> 
{

....
public interface ClickListener {
    void onItemClick(int paramInt, View paramView);
}

}

如何将适配器传递给构造函数,以便我可以访问类中的 ClickListener() 方法适配器。

例子

public class ABC{

private RecyclerView.Adapter adapter;

public ABC(RecyclerView.Adapter adapter){
this.adapter = adapter;
}

private void xyz(){

//How to achieve this
recyclerView.setOnClickListener(new adapter.ClickListener(){

@Override
        public void onItemClick(int position, View v) {

        }
    });   

}

好吧,在您的 Activity/Fragment 中,您有 RecyclerView 实例,在那里,您应该能够将 Recycler 传递给ABC ,以便它可以附加 onClick。

但是,我建议更好的设计是:您的活动/片段将您的适配器 OnClickListener 实现为:接收点击并将其传递给 ABC,然后 ABC 处理它。

喜欢:

public class SearchResultAdapter extends RecyclerView.Adapter<SearchResultAdapter.searchResultViewHolder> 
{

public void setListener(ClickListener listener){
    this.listener = listener;
}
public interface ClickListener {
    void onItemClick(int paramInt, View paramView);
}

}

public class ABC {
    public void adapterClicked(){
         // do something here on adapter item clicked.
    }
}

public class Activity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout....);

        SearchResultAdapter adapter = new ........();
        ABC abc = new ABC();

        adapter.setOnClickListener(() -> {
            abc.adapterClicked();
        }); // java 8
    }
}

我试过下面的方法创建一个接口 RecyclerOnItemClickListener

import android.view.View;

public interface RecyclerOnItemClickListener {

public void onItemClick(View childView, int position);
}

在适配器类中,您可以获取在调用 Activity/Fragment 中实现的 RecyclerOnItemClickListener 对象

RecyclerOnItemClickListener mItemClickListener;

然后您可以在适配器的构造函数中初始化该变量

mItemClickListener = recyclerOnItemClickListener;

活动/片段实现了 RecyclerOnItemClickListener 接口,因此它将实现 onItemClick 方法。 您可以在此处编写用于在下一个活动中传递数据的代码

@Override
public void onItemClick(View childView, int position)
{
    Intent intent = new Intent(getActivity(), NextActivity.class);
    intent.putExtra("ITEM", mModels.get(position));
    startActivity(intent);
}

在适配器类中,您需要初始化 ViewHolder 类,如下所示:

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
TextView content;
TextView proba;
ImageView imageView;


public ViewHolder(View itemView) {
    super(itemView);

    content = (TextView) itemView.findViewById(R.id.textView);
    proba = (TextView) itemView.findViewById(R.id.textView2);
    imageView = (ImageView) itemView.findViewById(R.id.imageView);


}

    @Override
    public void onClick(View v)
    {
        if (mItemClickListener != null)
        {
            mItemClickListener.onItemClick(v, getPosition());
        }
    }
}

从您的程序中,我了解到您希望在 RecyclerView 上使用ClickListener 这是我的适配器。

我在视图持有者类中创建的 ClickListener。 只需使用implements View.OnClickListener实现您的类。并通过getAdapterPosition()获取用户点击

class buses_list_adaptor extends RecyclerView.Adapter<buses_list_adaptor.viewholder> {
List <Detail_buses> list;

public buses_list_adaptor(List <Detail_buses> list) {
    this.list = list;
}

@Override
public buses_list_adaptor.viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    View view = layoutInflater.inflate(R.layout.list_buses, parent, false);

    return new viewholder(view, list);
}

@Override
public void onBindViewHolder(buses_list_adaptor.viewholder holder, int position) {
    holder.bus_no.setText(list.get(position).getBus_no());
    holder.start_bustop.setText(list.get(position).getFrom());
    holder.stop_bustop.setText(list.get(position).getTo());


}

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

class viewholder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView bus_no, start_bustop, stop_bustop;
    List <Detail_buses> list;

    public viewholder(View itemView, List <Detail_buses> list) {
        super(itemView);
        this.list = list;
        bus_no = itemView.findViewById(R.id.buses_bus_no);
        start_bustop = itemView.findViewById(R.id.buses_from_stop);
        stop_bustop = itemView.findViewById(R.id.buses_to_stop);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        Fragment fragment= new Bus_list_stp();
        Bundle bundle= new Bundle();
        bundle.putInt("position",getAdapterPosition());
        dashboardActivity.dashboardActivityOBJ.changeFragment(fragment,bundle);


    }
}

}

我希望这对你有用

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM