android 使用多个RecyclerView和一个Adapter类

t3irkdon  于 2023-05-21  发布在  Android
关注(0)|答案(3)|浏览(182)

我有3个RecyclerView来显示访问量最大的市场,靠近市场和最喜欢的市场。
我已经为三个RecyclerView类创建了3个不同的MarketAdapter示例
一切正常,但我的Activity实现了一个OnClickListener,我无法弄清楚单击的是哪个适配器。是否可以通过编程确定从OnClickListener单击的Adapter
我的MarketAdapter Class

public class MarketAdapter extends RecyclerView.Adapter<MarketAdapter.ViewHolder> {

ArrayList<Markets> mMarket = new ArrayList<>();
Context mContext;
private final MarketsItemsClickListener mItemsClickListener;
private final MarketLongClickListener mLongClickListener;
private final MarketClickListener mClickListener;

public MarketAdapter(Context context, MarketsItemsClickListener itemsClickListener, MarketClickListener clickListener, MarketLongClickListener longClickListener){
    mContext = context;
    mItemsClickListener = itemsClickListener;
    mLongClickListener = longClickListener;
    mClickListener = clickListener;
}

public interface MarketLongClickListener{
    void onLongClick(int position);
}

public interface MarketClickListener{
    void onClick(int position);
}

public interface MarketsItemsClickListener{
    void imageViewOnClickListener(View view, int position);
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    Context context = viewGroup.getContext();
    int layoutForListItem = R.layout.list_market;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view = inflater.inflate(layoutForListItem, viewGroup, shouldAttachToParentImmediately);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    viewHolder.bindView(i);
}

@Override
public int getItemCount() {
    if(mMarket != null) return mMarket.size();
    return 0;
}

public void setData(ArrayList<Markets> markets){
    mMarket = markets;
    notifyDataSetChanged();
}

public void addData(Markets market, int position){
    mMarket.add(0, market);
    notifyDataSetChanged();
}

public Markets getItem(int position){return mMarket.get(position);}

class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener{

    ImageView mImageView;
    TextView mNameTextView, mCityTextView;

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

        mImageView = itemView.findViewById(R.id.image_view);
        mNameTextView = itemView.findViewById(R.id.name_text_view);
        mCityTextView = itemView.findViewById(R.id.city_text_view);

        itemView.setOnLongClickListener(this);
        itemView.setOnClickListener(this);
    }

    void bindView(int position){
        Markets market = getItem(position);

        mCityTextView.setText(market.getCity());
        mNameTextView.setText(market.getName());
    }

    @Override
    public void onClick(View v) {
        //Get position of Adapter
        int position = getAdapterPosition();
        //Handle the click
        mClickListener.onClick(position);
    }

    @Override
    public boolean onLongClick(View v) {
        return false;
    }
}

}
OnClickListener来自Activity

@Override
public void onClick(int position) {}
5jvtdoz2

5jvtdoz21#

您可以在构造函数中传递一个标记,并通过单击侦听器将该标记取回,以将单击标识为

private final MarketsItemsClickListener mItemsClickListener;
private final MarketLongClickListener mLongClickListener;
private final MarketClickListener mClickListener;
private final String mTag;

public MarketAdapter(Context context, MarketsItemsClickListener itemsClickListener, MarketClickListener clickListener, MarketLongClickListener longClickListener, String tag){
    mTag = tag
    mContext = context;
    mItemsClickListener = itemsClickListener;
    mLongClickListener = longClickListener;
    mClickListener = clickListener;
}

将侦听器修改为

public interface MarketClickListener{
    void onClick(int position, String tag);
}

活动中的侦听器代码为

@Override
public void onClick(int position, String tag) {
    switch(tag){
        case "adapter1":
        break;
        case "adapter2":
        break;
        case "adapter3":
        break;
    }
}

并将适配器对象创建为

MarketAdapter adapter = new MarketAdapter("adapter1"....); 
 MarketAdapter adapter1 = new MarketAdapter("adapter2"....); 
 MarketAdapter adapter2 = new MarketAdapter("adapter3"....);

和使用

mClickListener.onClick(position, mTag);

注意:也可以使用枚举

2izufjch

2izufjch2#

您可以在MarketAdapter中添加一个属性,以便您可以知道它是什么示例。
更改自定义单击侦听器以接收适配器类型:

public interface MarketClickListener {
    //You can change this to receive any data you want from the adapter
    void onClick(int position, int adapterType);
}

在adatper中添加常量、identifier属性并更改监听器:

public class MarketAdapter extends RecyclerView.Adapter<MarketAdapter.ViewHolder> {
    //The constants types
    public static int MOST_VISITED_MARKETS = 1;
    public static int CLOSE_BY_MARKETS = 2;
    public static int FAVORITE_MARKETS = 3;
    //New attribute
    private int adapterType;

    ...
    //Keep the listener
    private final MarketClickListener mClickListener;

        public MarketAdapter(Context context, MarketsItemsClickListener itemsClickListener, MarketClickListener clickListener, MarketLongClickListener longClickListener, int adapterType){
            ...
            //Set the type
            adapterType = adapterType;
        }

        ...

}

在您的活动中:

mostVisitedRecyclerView.setAdapter(new MarketAdapter(this,itemsClickListener,clickListener,longClickListener,MarketAdapter.MOST_VISITED_MARKETS ));
closeByRecyclerView.setAdapter(new MarketAdapter(this,itemsClickListener,clickListener,longClickListener,MarketAdapter.CLOSE_BY_MARKETS));
favoritesRecyclerView.setAdapter(new MarketAdapter(this,itemsClickListener,clickListener,longClickListener,MarketAdapter.FAVORITE_MARKETS));

在视图保持器中,更改onClick

@Override
    public void onClick(View v) {
        //Get position of Adapter
        int position = getAdapterPosition();
        //Handle the click
        mClickListener.onClick(position,adapterType);
    }

我没有测试过这个,但我认为它会起作用。试试看。

iyfamqjs

iyfamqjs3#

如果你想这样做,我会添加一个新变量到适配器构造函数,然后使用case/if语句来确定你想在onbindviewholder中做什么。

相关问题