我有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) {}
3条答案
按热度按时间5jvtdoz21#
您可以在构造函数中传递一个标记,并通过单击侦听器将该标记取回,以将单击标识为
将侦听器修改为
活动中的侦听器代码为
并将适配器对象创建为
和使用
注意:也可以使用枚举
2izufjch2#
您可以在
MarketAdapter
中添加一个属性,以便您可以知道它是什么示例。更改自定义单击侦听器以接收适配器类型:
在adatper中添加常量、identifier属性并更改监听器:
在您的活动中:
在视图保持器中,更改
onClick
:我没有测试过这个,但我认为它会起作用。试试看。
iyfamqjs3#
如果你想这样做,我会添加一个新变量到适配器构造函数,然后使用case/if语句来确定你想在onbindviewholder中做什么。