Android 如何将单击侦听器添加到RecyclerView项
我确实在Stack上找到了很多帖子,这篇似乎是最好的选择,但是选择的答案只有部分。 这是链接: 你可以看到上面的答案表明:Android 如何将单击侦听器添加到RecyclerView项,android,android-recyclerview,Android,Android Recyclerview,我确实在Stack上找到了很多帖子,这篇似乎是最好的选择,但是选择的答案只有部分。 这是链接: 你可以看到上面的答案表明: private final OnClickListener mOnClickListener = new MyOnClickListener(); @Override public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { View view = La
private final OnClickListener mOnClickListener = new MyOnClickListener();
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}
然后是onClick方法:
@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
但是,这只猫在哪里?在一个单独的文件中?在带有适配器的活动中?如果它在一个单独的文件中,它实现了什么?你能帮我把这个答案写得更完整些吗 好问题。。我还跑了一段时间去拿:) 因此,我将向您发布一个回收器适配器代码,看看在哪里定义onClick 和一个活动,看看如何推动点击 适配器
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemViewHolder> {
private Context mContext;
private List<Items> mItemsArrayList;
private ItemClickListener mClickListener;
private ItemLongClickListener mLongClickListener;
public ItemAdapter(Context context, List<Items> arrayList) {
mContext = context;
mItemsArrayList = arrayList;
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.lists_list_item, parent, false);
return new ItemAdapter.ItemViewHolder(view);
}
@Override
public void onBindViewHolder(final ItemViewHolder holder, final int position) {
holder.itemName.setText(mItemsArrayList.get(position).getName());
int state = mItemsArrayList.get(position).getState();
final String category = mItemsArrayList.get(position).getCategory();
if (state == 0) {
holder.container.setBackgroundColor(mContext.getResources().getColor(R.color.white_color));
holder.itemName.setTextColor(mContext.getResources().getColor(R.color.colorPrimaryDark));
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.white_color));
holder.check.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_check_gray_24dp));
} else if (state == 1) {
holder.container.setBackgroundColor(mContext.getResources().getColor(R.color.light_gary));
holder.itemName.setTextColor(mContext.getResources().getColor(R.color.gray));
holder.check.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_check_black_24dp));
switch (category) {
case "Auto":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.purble));
break;
case "Bills":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.light_purple));
break;
case "Health":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.light_blue));
break;
case "Shop":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.green));
break;
case "Travel":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.orange));
break;
case "Work":
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.dark_blue));
break;
}
}
}
@Override
public int getItemCount() {
return mItemsArrayList.size();
}
// allows clicks events to be caught
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
public void setLongClickListener(ItemLongClickListener itemLongClickListener) {
this.mLongClickListener = itemLongClickListener;
}
// return data
public String getItemName(int id) {
return mItemsArrayList.get(id).getName();
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
}
public interface ItemLongClickListener {
void onItemLongClick(View view, int position);
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public LinearLayout container;
public LinearLayout stateColor;
public ImageView check;
public TextView itemName;
public ItemViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
container = (LinearLayout) itemView.findViewById(R.id.lists_item_container);
stateColor = (LinearLayout) itemView.findViewById(R.id.lists_item_state_color);
check = (ImageView) itemView.findViewById(R.id.lists_item_check);
itemName = (TextView) itemView.findViewById(R.id.lists_item_name);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
@Override
public boolean onLongClick(View view) {
if (mLongClickListener != null) {
mLongClickListener.onItemLongClick(view, getAdapterPosition());
return true;
} else {
return false;
}
}
}
公共类ItemAdapter扩展了RecyclerView.Adapter{
私有上下文;
私有列表;
私有项ClickListener McClickListener;
私有项LongClickListener mlLongClickListener;
公共ItemAdapter(上下文上下文,列表arrayList){
mContext=上下文;
mItemsArrayList=阵列列表;
}
@凌驾
public ItemViewHolder onCreateViewHolder(视图组父级,int-viewType){
LayoutFlater充气机=LayoutFlater.from(mContext);
视图=充气机。充气(R.layout.lists\u list\u项目,父项,false);
返回新的ItemAdapter.ItemViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终ItemViewHolder,最终int位置){
holder.itemName.setText(mItemsArrayList.get(position.getName());
int state=mItemsArrayList.get(position.getState();
最后一个字符串category=mItemsArrayList.get(position.getCategory();
如果(状态==0){
holder.container.setBackgroundColor(mContext.getResources().getColor(R.color.white_color));
holder.itemName.setTextColor(mContext.getResources().getColor(R.color.colorPrimaryDark));
setBackgroundColor(mContext.getResources().getColor(R.color.white_color));
holder.check.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_check_gray_24dp));
}else if(state==1){
holder.container.setBackgroundColor(mContext.getResources().getColor(R.color.light_-gary));
holder.itemName.setTextColor(mContext.getResources().getColor(R.color.gray));
holder.check.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_check_black_24dp));
开关(类别){
案例“自动”:
setBackgroundColor(mContext.getResources().getColor(R.color.purble));
打破
“法案”一案:
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.light_purple));
打破
案例“健康”:
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.light_blue));
打破
案例“商店”:
setBackgroundColor(mContext.getResources().getColor(R.color.green));
打破
案例“旅行”:
setBackgroundColor(mContext.getResources().getColor(R.color.orange));
打破
案例“工作”:
holder.stateColor.setBackgroundColor(mContext.getResources().getColor(R.color.Derk_blue));
打破
}
}
}
@凌驾
public int getItemCount(){
返回mItemsArrayList.size();
}
//允许捕获单击事件
public void setClickListener(项ClickListener项ClickListener){
this.mClickListener=itemClickListener;
}
public void setLongClickListener(ItemLongClickListener ItemLongClickListener){
this.mLongClickListener=itemLongClickListener;
}
//返回数据
公共字符串getItemName(int id){
返回mItemsArrayList.get(id).getName();
}
//父活动将实现此方法以响应单击事件
公共接口项ClickListener{
void onItemClick(视图,int位置);
}
公共接口项LongClickListener{
单击鼠标左键(视图,int位置);
}
公共类ItemViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener、View.OnLongClickListener{
公共线路布局集装箱;
公共线路布局状态颜色;
公众影像查看检查;
公共文本视图项目名称;
公共项目视图持有者(查看项目视图){
超级(项目视图);
setOnClickListener(这个);
setOnLongClickListener(此);
container=(LinearLayout)itemviewbyd(R.id.lists\u item\u container);
stateColor=(LinearLayout)itemView.findViewById(R.id.lists\u item\u state\u color);
check=(ImageView)itemView.findViewById(R.id.lists\u item\u check);
itemName=(TextView)itemView.findViewById(R.id.lists\u item\u name);
}
@凌驾
公共void onClick(视图){
if(mClickListener!=null)mClickListener.onItemClick(视图,getAdapterPosition());
}
@凌驾
仅长按公共布尔值(视图){
if(mLongClickListener!=null){
mLongClickListener.onitelongclick(视图,getAdapterPosition());
返回true;
}否则{
返回false;
}
}
}
}
活动
public class ListsActivity extends AppCompatActivity implements ItemAdapter.ItemClickListener, ItemAdapter.ItemLongClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lists_layout);
usersDbHelper = new MyUsersDbHelper(this);
switch (keyCategory) {
case "":
goNext(keyCategory);
break;
case "Auto":
goNext(keyCategory);
break;
case "Bills":
goNext(keyCategory);
break;
case "Health":
goNext(keyCategory);
break;
case "Shop":
goNext(keyCategory);
break;
case "Travel":
goNext(keyCategory);
break;
case "Work":
goNext(keyCategory);
break;
}
}
private void goNext(final String category) {
if (guide.equals("")) {
title.setText("Lists");
// Find and set empty view on the recycler View, so that it only shows when the list has 0 items.
emptyView = (RelativeLayout) findViewById(R.id.lists_empty_view);
// Find the Recycler View which will be populated with the event data
itemsListView = (RecyclerView) findViewById(R.id.lists_recycler);
itemsListView.addItemDecoration(new DividerItemDecoration(itemsListView.getContext(), DividerItemDecoration.VERTICAL));
itemsListView.setLayoutManager(new LinearLayoutManager(this));
// List<Items> to populate recycler View
itemsList = usersDbHelper.readItemsList(username);
if (itemsList.size() == 0) {
itemsListView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
} else {
itemsListView.setVisibility(View.VISIBLE);
emptyView.setVisibility(View.GONE);
}
eItemAdapter = new ItemAdapter(this, itemsList);
eItemAdapter.setClickListener(this);
eItemAdapter.setLongClickListener(this);
eItemAdapter.notifyDataSetChanged();
itemsListView.setAdapter(eItemAdapter);
search = (ImageView) findViewById(R.id.lists_item_search);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showCustomSearchDialog(ListsActivity.this, itemsList);
}
});
listNumber = (TextView) findViewById(R.id.lists_item_num);
listNumber.setText(String.valueOf(itemsList.size()));
}
}
// CLICKS HERE
@Override
public void onItemClick(View view, int position) {
usersDbHelper = new MyUsersDbHelper(this);
String name = itemsList.get(position).getName();
int state = itemsList.get(position).getState();
String username = itemsList.get(position).getUsername();
if (state == 0) {
usersDbHelper.updateItemState(username, name, 1);
itemsList.get(position).setmState(1);
eItemAdapter.notifyItemChanged(position);
} else if (state == 1) {
usersDbHelper.updateItemState(username, name, 0);
itemsList.get(position).setmState(0);
eItemAdapter.notifyItemChanged(position);
}
}
@Override
public void onItemLongClick(View view, int position) {
showCustomDeleteDialog(ListsActivity.this, position);
}
公共类ListActivity扩展AppCompative实现ItemAdapter.ItemClickListener、ItemAdapter.ItemLongClickListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.lists\u布局);
usersDbHelper=新的MyUsersDbHelper(此);
开关(钥匙类别){
案例“”:
goNext(键类别);
打破
案例“自动”:
goNext(键类别);
打破
“法案”一案:
goNext(键类别);
打破
案例“健康”:
goNext(键类别);
打破
案例“商店”:
goNext(键类别);
打破
案例“旅行”:
goNext(键类别);
打破
案例”
public interface OnItemClickListener {
void onItemClick([your params]);
}
private OnItemClickListener listener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick([Your params]) {
}
});
public Holder(View itemView){
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// bla bla
}
});
}
public interface OnItemClickListener {
void onItemClick(int position);
void onShareClick(int position);
}
public Holder(View itemView, final OnItemClickListener listener) {
super(itemView);
mshareButton = itemView.findViewById(R.id.iv_share);
// listener for whole item
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(position);
}
});
// listener for button inside item
mShareButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onShareClick(position);
}
});
}
adapter = new RecyclerViewAdapter(this, arrayList);
((RecyclerViewAdapter) adapter).setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(getApplicationContext(), "whole item", Toast.LENGTH_SHORT).show();
}
@Override
public void onShareClick(int position) {
Toast.makeText(getApplicationContext(), "share", Toast.LENGTH_SHORT).show();
}
});