Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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,我一直在努力在RecyclerView上实现一个点击监听器。我已经看到了几种方法,并且更愿意处理活动中的ImageView点击,因为我需要将意图传递给另一个活动,并在主线程之外完成一些工作。以下是我迄今为止实施的内容: 在自定义RecyclerView适配器中注册单击 public class BasemapAdapter extends RecyclerView.Adapter<BasemapViewHolder> { // Context to construct view p

我一直在努力在RecyclerView上实现一个点击监听器。我已经看到了几种方法,并且更愿意处理活动中的ImageView点击,因为我需要将意图传递给另一个活动,并在主线程之外完成一些工作。以下是我迄今为止实施的内容:

在自定义RecyclerView适配器中注册单击

public class BasemapAdapter extends RecyclerView.Adapter<BasemapViewHolder> {

// Context to construct view
private Context mContext;
// Copy of all BasemapItems
private ArrayList<BasemapItem> items;

private int rowLayout;

public BasemapAdapter(ArrayList<BasemapItem> portalItems, int rowLayout, Context context){
    this.mContext = context;
    this.items = portalItems;
    this.rowLayout = rowLayout;
}

@Override
public BasemapViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);

    return new BasemapViewHolder(view);

}

/**
 * Fill the view with data from our adapter
 *
 * @param viewHolder
 * @param position
 */
@Override
public void onBindViewHolder(BasemapViewHolder viewHolder, final int position){
    // get the element from your dataset at this position
    // replace the contents of the view with the element
    viewHolder.basemapImage.setImageBitmap(items.get((position)).basemapImage);
    viewHolder.basemapName.setText(items.get((position)).item.getTitle());

    viewHolder.setBasemapClickListener(new BasemapViewHolder.BasemapClickListener() {
        @Override
        public void onBasemapItemClicked(View view, int position) {
            Log.d("TAG", "clicked at " + position);
        }
    });

}

@Override
public int getItemCount(){
    return items == null ? 0 : items.size();
}
}
在活动中创建适配器的实例

mBasemapAdapter = new BasemapAdapter( mBasemapList , R.layout.row_basemap, this);

mRecyclerView.setAdapter(mBasemapAdapter);

如果要处理ImageView,只需单击鼠标即可,应按如下操作:

@InjectView(R.id.basemapName) TextView basemapName;
@InjectView(R.id.basemapImage) ImageView basemapImage;

private BasemapClickListener clickListener;

public BasemapViewHolder(View itemView) {
    super(itemView);

    ButterKnife.inject(this, itemView);

    // set listener to whole item view
    //itemView.setOnClickListener(this); // comment out this line
    basemapImage.setOnClickListener(this); // <---- add this line
}

我通过在TextView上设置onClickListener解决了这个问题,因为它覆盖了ImageView:

BasemapAdapter

    @Override
public void onBindViewHolder(BasemapViewHolder viewHolder, final int position){
    final BasemapItem item = items.get(position);
    // get the element from your dataset at this position
    // replace the contents of the view with the element
    viewHolder.image.setImageBitmap(items.get(position).getImage());
    viewHolder.title.setText(items.get(position).getItem().getTitle());

    viewHolder.title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(item != null){
                clickListener.onImageClick(items.indexOf(item));
            }
        }
    });

    viewHolder.itemView.setTag(item);
}
然后我可以从活动内部调用onBaseMapClickListener

        mBasemapAdapter.setOnBaseMapClickListener(new BasemapClickListener() {

        @Override
        public void onImageClick(int position) {
            Toast.makeText(getApplicationContext(), "tapped" + position, Toast.LENGTH_LONG).show();
        }
    });

我一直在整项视图或ImageView上设置侦听器。两者都不适用于我。@jdone我将检查我的编辑并查看。如果无效,请告诉我是否调用了void onClick(视图v)。当前setOnBasemapClickListener()位于BasemapViewHolder上,它是onBindViewHolder()中的一个参数,因此无法进行更改。我之前在BasemapAdapter上将它设置为一个内部类,并尝试在视图的onBindViewHolder()中执行,但代码从未到达onClick()@jdONeill,这很奇怪。尝试使用findviewbyid而不是imageview的注入,看看它是否有效。是的,在提出问题之前尝试过,没有运气。我有一个简单的应用程序,现在真的很困惑。
    @Override
public void onBindViewHolder(BasemapViewHolder viewHolder, final int position){
    final BasemapItem item = items.get(position);
    // get the element from your dataset at this position
    // replace the contents of the view with the element
    viewHolder.image.setImageBitmap(items.get(position).getImage());
    viewHolder.title.setText(items.get(position).getItem().getTitle());

    viewHolder.title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(item != null){
                clickListener.onImageClick(items.indexOf(item));
            }
        }
    });

    viewHolder.itemView.setTag(item);
}
        mBasemapAdapter.setOnBaseMapClickListener(new BasemapClickListener() {

        @Override
        public void onImageClick(int position) {
            Toast.makeText(getApplicationContext(), "tapped" + position, Toast.LENGTH_LONG).show();
        }
    });