Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将单击侦听器添加到RecyclerView项_Android_Android Recyclerview - Fatal编程技术网

Android 如何将单击侦听器添加到RecyclerView项

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

我确实在Stack上找到了很多帖子,这篇似乎是最好的选择,但是选择的答案只有部分。 这是链接:

你可以看到上面的答案表明:

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