将多个RecyclerView与一个Adapter类一起使用

时间:2018-11-21 16:11:43

标签: java android android-recyclerview

我有3个RecyclerView来显示访问量最大的市场,临近的市场和最喜欢的市场。

我为三个MarketAdapter创建了RecyclerView类的三个差异实例

一切正常,但是我的Activity实现了一个OnClickListener,我无法确定单击了哪个适配器。是否可以通过编程确定从Adapter单击的OnClickListener

这是我的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) {}

3 个答案:

答案 0 :(得分:5)

您可以在构造函数中传递代码,然后通过点击监听器将其返回,以将点击标识为

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);

注意:您也可以使用枚举

答案 1 :(得分:1)

如果要这样做,我将向适配器的构造函数中添加一个新变量,然后使用case / if语句确定要在onbindviewholder中执行的操作。

答案 2 :(得分:1)

您可以在MarketAdapter内添加一个属性,以便可以知道该适配器是哪个实例。

更改您的自定义Click侦听器以接收适配器类型:

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

添加常量,标识符属性并更改adatper中的侦听器:

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);
    }

我没有对此进行测试,但是我认为它可以解决问题。试试吧。