Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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
Java RecyclerVIew侦听器不工作_Java_Android_Android Recyclerview_Adapter_Onitemclicklistener - Fatal编程技术网

Java RecyclerVIew侦听器不工作

Java RecyclerVIew侦听器不工作,java,android,android-recyclerview,adapter,onitemclicklistener,Java,Android,Android Recyclerview,Adapter,Onitemclicklistener,我正在使用RecyclerView,并尝试使用界面为RecyclerView的每个项目使用单击侦听器 这是我的活动课: public class LegacyHomeActivity extends ActivityBaseDrawer { private List<LegacyVideo> legacyVideoList = null; private List<Video> videoList = new ArrayList<>();

我正在使用RecyclerView,并尝试使用界面为RecyclerView的每个项目使用单击侦听器

这是我的活动课:

public class LegacyHomeActivity extends ActivityBaseDrawer {
    private List<LegacyVideo> legacyVideoList = null;
    private List<Video> videoList = new ArrayList<>();
    private RecyclerView mRecyclerView;
    private LegacyModeHomeAdapter adapter;

    @Override
    public void onNetworkStateChanged(boolean connected) {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        isLegacyMode = true;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_legacy_home);
        if (getSupportActionBar() != null) {
            setTitle(getString(R.string.footy_legacy_home));
        }
        ImageView legacy_live_score_imageView = (ImageView) findViewById(R.id.legacy_live_score_imageView);
        legacy_live_score_imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(LegacyHomeActivity.this, LegacyLiveScoreActivity.class));
            }
        });
        ImageView legacy_highlight_imageView = (ImageView) findViewById(R.id.legacy_highlight_imageView);
        legacy_highlight_imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(LegacyHomeActivity.this, LegacyHighlightsActivity.class));
            }
        });
        ImageView legacy_news_imageView = (ImageView) findViewById(R.id.legacy_news_imageView);
        legacy_news_imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(LegacyHomeActivity.this, LegacyNewsActivity.class));
            }
        });
        mRecyclerView = (RecyclerView) findViewById(R.id.legacy_mood_recyclerview);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(layoutManager);
        adapter = new LegacyModeHomeAdapter(getApplicationContext(), itemClickListener);
        mRecyclerView.setAdapter(adapter);
        mRecyclerView.setHasFixedSize(true);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setColorSchemeResources(R.color.ThemeColor,
                R.color.ThemeColor, R.color.ThemeColor);
        swipeRefreshLayout
                .setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

                    @Override
                    public void onRefresh() {
                        getLegacyVideoList();
                    }
                });

        circularProgressView = (CircularProgressView) findViewById(R.id.circularProgressView);
        showLoadingProgress();
        getLegacyVideoList();
    }

    LegacyVideoClickListener itemClickListener = new LegacyVideoClickListener() {
        @Override
        public void onItemClickListener(int position) {
            Video video = videoList.get(position);
            VideoPlayerUtil.initVideoPLayer(video, LegacyHomeActivity.this);
        }
    };

    private void getLegacyVideoList() {
        FootyLightAPI api = new FootyLightAPI(getApplicationContext(), mResponseListener);
        api.getLegacyHomeVideoList();
    }

    private final FootyLightAPI.ResponseListener mResponseListener = new FootyLightAPI.ResponseListener() {
        @Override
        public void getResponse(int apiId, final String response) {
            switch (apiId) {
                case R.integer.ApiLegacyVideoList:
                    Log.e("Legacy  ............", "Response:................" + response);
                    try {
                        final ObjectMapper mapper = new ObjectMapper();
                        legacyVideoList = mapper.readValue(response, new TypeReference<List<LegacyVideo>>() {
                        });
                        if (legacyVideoList != null && legacyVideoList.size() > 0) {
                            videoList.clear();
                            for (LegacyVideo video : legacyVideoList) {
                                Log.e("Legacy video", "" + video.getTitle());
                                Video videoItem = new Video();
                                if (video.getItemType().equalsIgnoreCase("video")) {
                                    videoItem.setTitle(video.getTitle());
                                    videoItem.setLink(video.getLink());
                                    videoItem.setThumb(video.getThumb());
                                    videoItem.setContentType(video.getContentType());
                                    videoItem.setContentUrl(video.getContentUrl());
                                    videoItem.setDmcaLabel(video.getDmcaLabel());
                                    videoItem.setDmcaContent(video.getDmcaContent());
                                    videoItem.setDmcaDisclaimer(video.getDmcaDisclaimer());
                                    videoItem.setDisplayType(video.getDisplayType());
                                    videoList.add(videoItem);
                                }

                            }
                        }
                        Log.e("VideoList", "........." + videoList.size());
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                showVideoAdapter();
                                hideLoadingProgress();

                            }
                        });


                    } catch (Exception e) {

                    }
                    break;
                default:
                    break;
            }
        }

        @Override
        public void getError(int apiId, int errorCode) {
        }

        @Override
        public void getResponse(String trackingStr, int apiId, String response) {

        }

        @Override
        public void getError(String trackingStr, int apiId, int errorCode) {

        }
    };

    public void showVideoAdapter() {
        if (adapter != null) {
            adapter.setVideos(videoList);
        }
    }
}
这个程序可以很好地工作我的应用程序的其他部分,但不工作的情况下。我不知道问题出在哪里。请帮帮我

@Override
public void onBindViewHolder(RecyclerViewAdapter.ItemViewHolder holder, int position) {
        holder.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

}
试着这样做

检查一下这个样本

mListener = (Listener) context;
public class LegacyHomeActivity extends ActivityBaseDrawer implements listner {

@Override
public void performOperation(int Position) {
    //Do whatever you want to do with this position
}

}
public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> {
    private List<Video> videoList;
    private Context mContext;
    public static LegacyVideoClickListener onVideosRVItemClickListener;

    private LayoutInflater getLayoutInflater() {
        return LayoutInflater.from(mContext);
    }

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) {
        this.mContext = mContext;
        this.onVideosRVItemClickListener = onVideosRVItemClickListener;
    }

    public void setVideos(List<Video> videosList) {
        this.videoList = videosList;
        notifyDataSetChanged();
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        Video video = videoList.get(position);
   Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage);
        holder.categoryName.setText(video.getTitle());
        holder.title_image_btn.setText(video.getDisplayType());
        holder.VideosItemClickListener(position, onVideosRVItemClickListener);
    }

    @Override
    public int getItemCount() {
        if (videoList != null) {
            return videoList.size();
        }
        return 0;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView categoryName;
        private ImageView categoryImage;
        private Button title_image_btn;

        public ItemViewHolder(View itemView) {
            super(itemView);
            categoryName = (TextView) itemView.findViewById(R.id.categoryName);
            categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage);
            title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            onVideosRVItemClickListener.onItemClickListener(getPosition(), v);
        }
    }
    public void setOnItemClickListener(LegacyVideoClickListener clickListener) {
            LegacyModeHomeAdapter.onVideosRVItemClickListener = clickListener;
    }
    public interface LegacyVideoClickListener {
        public void onItemClickListener(int position, View v);
    }
}
adapter.setOnItemClickListener(new LegacyModeHomeAdapter.LegacyVideoClickListener() {
        @Override
        public void onItemClick(int position, View v) {
            //Your code
        }
    });
OnCLick可以使用自定义接口实现

interface Listener {
    void performOperation(int Position);
}
在适配器中

private Listener mListener;
在适配器中,在构造函数中初始化listner,如下所示

mListener = (Listener) context;
public class LegacyHomeActivity extends ActivityBaseDrawer implements listner {

@Override
public void performOperation(int Position) {
    //Do whatever you want to do with this position
}

}
public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> {
    private List<Video> videoList;
    private Context mContext;
    public static LegacyVideoClickListener onVideosRVItemClickListener;

    private LayoutInflater getLayoutInflater() {
        return LayoutInflater.from(mContext);
    }

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) {
        this.mContext = mContext;
        this.onVideosRVItemClickListener = onVideosRVItemClickListener;
    }

    public void setVideos(List<Video> videosList) {
        this.videoList = videosList;
        notifyDataSetChanged();
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        Video video = videoList.get(position);
   Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage);
        holder.categoryName.setText(video.getTitle());
        holder.title_image_btn.setText(video.getDisplayType());
        holder.VideosItemClickListener(position, onVideosRVItemClickListener);
    }

    @Override
    public int getItemCount() {
        if (videoList != null) {
            return videoList.size();
        }
        return 0;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView categoryName;
        private ImageView categoryImage;
        private Button title_image_btn;

        public ItemViewHolder(View itemView) {
            super(itemView);
            categoryName = (TextView) itemView.findViewById(R.id.categoryName);
            categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage);
            title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            onVideosRVItemClickListener.onItemClickListener(getPosition(), v);
        }
    }
    public void setOnItemClickListener(LegacyVideoClickListener clickListener) {
            LegacyModeHomeAdapter.onVideosRVItemClickListener = clickListener;
    }
    public interface LegacyVideoClickListener {
        public void onItemClickListener(int position, View v);
    }
}
adapter.setOnItemClickListener(new LegacyModeHomeAdapter.LegacyVideoClickListener() {
        @Override
        public void onItemClick(int position, View v) {
            //Your code
        }
    });
在bindViewHolder方法中

holder.yourView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mListener.performOperation(position);
        }
    });
现在在您的活动中,像这样实现该接口

mListener = (Listener) context;
public class LegacyHomeActivity extends ActivityBaseDrawer implements listner {

@Override
public void performOperation(int Position) {
    //Do whatever you want to do with this position
}

}
public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> {
    private List<Video> videoList;
    private Context mContext;
    public static LegacyVideoClickListener onVideosRVItemClickListener;

    private LayoutInflater getLayoutInflater() {
        return LayoutInflater.from(mContext);
    }

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) {
        this.mContext = mContext;
        this.onVideosRVItemClickListener = onVideosRVItemClickListener;
    }

    public void setVideos(List<Video> videosList) {
        this.videoList = videosList;
        notifyDataSetChanged();
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        Video video = videoList.get(position);
   Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage);
        holder.categoryName.setText(video.getTitle());
        holder.title_image_btn.setText(video.getDisplayType());
        holder.VideosItemClickListener(position, onVideosRVItemClickListener);
    }

    @Override
    public int getItemCount() {
        if (videoList != null) {
            return videoList.size();
        }
        return 0;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView categoryName;
        private ImageView categoryImage;
        private Button title_image_btn;

        public ItemViewHolder(View itemView) {
            super(itemView);
            categoryName = (TextView) itemView.findViewById(R.id.categoryName);
            categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage);
            title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            onVideosRVItemClickListener.onItemClickListener(getPosition(), v);
        }
    }
    public void setOnItemClickListener(LegacyVideoClickListener clickListener) {
            LegacyModeHomeAdapter.onVideosRVItemClickListener = clickListener;
    }
    public interface LegacyVideoClickListener {
        public void onItemClickListener(int position, View v);
    }
}
adapter.setOnItemClickListener(new LegacyModeHomeAdapter.LegacyVideoClickListener() {
        @Override
        public void onItemClick(int position, View v) {
            //Your code
        }
    });

在ItemViewHolder构造函数中传递VideosVitemClickListener

@Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false);
        return new ItemViewHolder(view, onVideosRVItemClickListener);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        Video video = videoList.get(position);
        Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage);
        holder.categoryName.setText(video.getTitle());
        holder.title_image_btn.setText(video.getDisplayType());

    }

    public class ItemViewHolder extends RecyclerView.ViewHolder {
        private TextView categoryName;
        private ImageView categoryImage;
        private Button title_image_btn;

        public ItemViewHolder(View itemView, final LegacyVideoClickListener videosRVItemClickListener) {
            super(itemView);
            categoryName = (TextView) itemView.findViewById(R.id.categoryName);
            categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage);
            title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    videosRVItemClickListener.onItemClickListener(getAdapterPosition());
                }
            });
        }

    }
您可以使用这种方法:

@Override 
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final String element = mDataset[position];

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //your code 
            }
        });
    }

您的接口适配器类应该如下所示

mListener = (Listener) context;
public class LegacyHomeActivity extends ActivityBaseDrawer implements listner {

@Override
public void performOperation(int Position) {
    //Do whatever you want to do with this position
}

}
public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> {
    private List<Video> videoList;
    private Context mContext;
    public static LegacyVideoClickListener onVideosRVItemClickListener;

    private LayoutInflater getLayoutInflater() {
        return LayoutInflater.from(mContext);
    }

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) {
        this.mContext = mContext;
        this.onVideosRVItemClickListener = onVideosRVItemClickListener;
    }

    public void setVideos(List<Video> videosList) {
        this.videoList = videosList;
        notifyDataSetChanged();
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        Video video = videoList.get(position);
   Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage);
        holder.categoryName.setText(video.getTitle());
        holder.title_image_btn.setText(video.getDisplayType());
        holder.VideosItemClickListener(position, onVideosRVItemClickListener);
    }

    @Override
    public int getItemCount() {
        if (videoList != null) {
            return videoList.size();
        }
        return 0;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView categoryName;
        private ImageView categoryImage;
        private Button title_image_btn;

        public ItemViewHolder(View itemView) {
            super(itemView);
            categoryName = (TextView) itemView.findViewById(R.id.categoryName);
            categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage);
            title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            onVideosRVItemClickListener.onItemClickListener(getPosition(), v);
        }
    }
    public void setOnItemClickListener(LegacyVideoClickListener clickListener) {
            LegacyModeHomeAdapter.onVideosRVItemClickListener = clickListener;
    }
    public interface LegacyVideoClickListener {
        public void onItemClickListener(int position, View v);
    }
}
adapter.setOnItemClickListener(new LegacyModeHomeAdapter.LegacyVideoClickListener() {
        @Override
        public void onItemClick(int position, View v) {
            //Your code
        }
    });
使用这种接口设置方式,您可以准确地实现onclick侦听器功能。
如果您仍然有问题,请告诉我。

我认为我使用的界面与您提到的一样工作。我的代码有问题吗@AkshaySorry但是我很难理解你的代码,我在android方面不是很先进,但是你能告诉我你在那里做什么@Md Aslam Hossin,但是如果你想点击回收站中的一个项目,上面提到的是你可以做的,如果你能详细说明你想要什么,我可以帮助你,这不是一个好方法。As onBindViewHolder将在任何时候循环视图滚动时被调用。因此,每次列表滚动时,即使有一点点,它也会为当前可见的所有项目设置ClickListener,这是无效的。不,它不会被调用。当recyclerView scrollsyeah。。。我刚才就是这么说的。当您再次滚动一点时,它将再次调用同一itemView的setOnClickListener,不是吗?
    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public Button btMyButton;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
               // your implementation. In order to get position you can use `getAdapterPosition()` method               
       }
    }