Android onClickItem在RecyclerView上不起作用
我正在尝试在Android上实现Android onClickItem在RecyclerView上不起作用,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,我正在尝试在Android上实现onClicklistener。单击时,我需要从GridLayoutManager获取一个特定项目的详细信息。onClick可以工作,但它列出了数组列表中的所有项。 适配器类: public class MoviesGridAdapter extends RecyclerView.Adapter<MoviesGridAdapter.PosterViewHolder> { private Context context; pri
onClick
listener。单击时,我需要从GridLayoutManager
获取一个特定项目的详细信息。onClick
可以工作,但它列出了数组列表中的所有项。
适配器类:
public class MoviesGridAdapter extends RecyclerView.Adapter<MoviesGridAdapter.PosterViewHolder> {
private Context context;
private List<Movies> movieItems = new ArrayList<>();
public MoviesGridAdapter(Context context, List<Movies> movieItems) {
this.context = context;
this.movieItems = movieItems;
}
@Override
public PosterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movies_poster_grid_view_item, parent, false);
return new PosterViewHolder(view);
}
@Override
public void onBindViewHolder(PosterViewHolder holder, int position) {
final Movies movies = movieItems.get(position);
String posterUrlPath = movies.getPosterPath();
Picasso.with(context)
.load(Constants.MOVIE_POSTER_URL + posterUrlPath).into(holder.poster);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, MovieDetailsActivity.class);
intent.putExtra("Title", movies.getTitle());
intent.putExtra("Overview", movies.getOverview());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return movieItems.size();
}
public class PosterViewHolder extends RecyclerView.ViewHolder {
ImageView poster;
final View mView;
public PosterViewHolder(View itemView) {
super(itemView);
mView = itemView;
poster = (ImageView) itemView.findViewById(R.id.movies_poster_mv);
}
}
public void setMovies(List<Movies> movies) {
movieItems.clear();
movieItems = movies;
notifyDataSetChanged();
}
}
公共类MoviesGridAdapter扩展了RecyclerView.Adapter{
私人语境;
private List movieItems=new ArrayList();
公共MoviesGridAdapter(上下文上下文,列出movieItems){
this.context=上下文;
this.movieItems=movieItems;
}
@凌驾
public PosterViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.movies\u poster\u grid\u View\u item,parent,false);
返回新的PosterViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(PosterViewHolder,内部位置){
最终电影=电影项目。获取(位置);
字符串posterUrlPath=movies.getPosterPath();
毕加索。与(上下文)
.load(Constants.MOVIE\u POSTER\u URL+posterUrlPath).into(holder.POSTER);
holder.mView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
意向意向=新意向(上下文、MovieDetailsActivity.class);
intent.putExtra(“Title”,movies.getTitle());
intent.putExtra(“概述”,movies.getOverview());
背景。开始触觉(意图);
}
});
}
@凌驾
public int getItemCount(){
返回movieItems.size();
}
公共类PosterViewHolder扩展了RecyclerView.ViewHolder{
ImageView海报;
最终视图mView;
公共PosterViewHolder(视图项视图){
超级(项目视图);
mView=项目视图;
poster=(ImageView)itemView.findViewById(R.id.movies\u poster\u mv);
}
}
公共电影(列出电影){
movieItems.clear();
电影项目=电影;
notifyDataSetChanged();
}
}
我也在ViewHolder
类上尝试了这一点,该类使用API中声明的getAdapterPosition()
扩展了RecyclerView.ViewHolder
。我得到了另一个活动/片段的意图,但我没有得到点击项目的位置,而是加载了整个列表。这是我的建议ListView
具有OnItemClickListner
或ArrayAdapter
,RecyclerView
缺少该功能
提前感谢您的帮助。您的方法是错误的,请尝试类似的方法
public class YourClassAdapter extends RecyclerView.Adapter<YourClassAdapter.YourClassViewHolder>
implements View.OnClickListener {
private ArrayList<Object> objects;
private View.OnClickListener listener;
public YourClassAdapter(ArrayList<Object> objects) {
this.objects = objects;
}
@Override
public YourClassViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.your_layout, parent, false);
itemView.setOnClickListener(this);
return new YourClassViewHolder(itemView);
}
@Override
public void onBindViewHolder(YourClassViewHolder holder, int position) {
Object object = objects.get(position);
holder.bindObject(object);
}
@Override
public int getItemCount() {
return objects.size();
}
public void setOnClickListener(View.OnClickListener listener) {
this.listener = listener;
}
@Override
public void onClick(View view) {
if(listener != null)
listener.onClick(view);
}
public static class YourClassViewHolder extends RecyclerView.ViewHolder {
public YourClassViewHolder(View itemView) {
super(itemView);
}
public void bindObject(Object object) {
}
}
你的方法是错误的尝试这样的方法
public class YourClassAdapter extends RecyclerView.Adapter<YourClassAdapter.YourClassViewHolder>
implements View.OnClickListener {
private ArrayList<Object> objects;
private View.OnClickListener listener;
public YourClassAdapter(ArrayList<Object> objects) {
this.objects = objects;
}
@Override
public YourClassViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.your_layout, parent, false);
itemView.setOnClickListener(this);
return new YourClassViewHolder(itemView);
}
@Override
public void onBindViewHolder(YourClassViewHolder holder, int position) {
Object object = objects.get(position);
holder.bindObject(object);
}
@Override
public int getItemCount() {
return objects.size();
}
public void setOnClickListener(View.OnClickListener listener) {
this.listener = listener;
}
@Override
public void onClick(View view) {
if(listener != null)
listener.onClick(view);
}
public static class YourClassViewHolder extends RecyclerView.ViewHolder {
public YourClassViewHolder(View itemView) {
super(itemView);
}
public void bindObject(Object object) {
}
}
像我在下面的示例中所做的那样,将您的点击监听器置于您的内部 这是我的项目中的适配器,我的单击对我来说很好
/**
* Created by Rakshit on 7/20/2016.
*/
public class MyWishListAdapter extends RecyclerView.Adapter<MyWishListAdapter.DataViewHolder> {
private List<UserWishlist> mList;
Activity mContext;
MyWishListFragment fragment;
public MyWishListAdapter(Activity mContext, MyWishListFragment fragment) {
mList = new ArrayList<>();
this.mContext = mContext;
this.fragment = fragment;
}
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_wishlist_table_row_item, parent, false);
Constants.setAppFont((ViewGroup) v, parent.getContext());
DataViewHolder dataView = new DataViewHolder(v);
return dataView;
}
@Override
public void onBindViewHolder(final DataViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return mList.size();
}
public class DataViewHolder extends RecyclerView.ViewHolder implements APIServerResponse {
public DataViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//View click listener here
}
});
}
}
/**
*由Rakshit于2016年7月20日创建。
*/
公共类MyWishListAdapter扩展了RecyclerView.Adapter{
私人名单;
活动mContext;
粘虫碎片;
公共MyWishListAdapter(活动mContext,MyWishListFragment){
mList=新的ArrayList();
this.mContext=mContext;
this.fragment=片段;
}
@凌驾
public DataViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.my\u wishlist\u table\u row\u item,parent,false);
Constants.setAppFont((ViewGroup)v,parent.getContext());
DataViewHolder dataView=新的DataViewHolder(v);
返回数据视图;
}
@凌驾
公共无效onBindViewHolder(最终数据视图持有人,内部位置){
}
@凌驾
public int getItemCount(){
返回mList.size();
}
公共类DataViewHolder扩展了RecyclerView。ViewHolder实现了APIServerResponse{
公共数据视图持有者(视图v){
超级(五);
v、 setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
//查看单击此处的侦听器
}
});
}
}
像我在下面的示例中所做的那样,将您的点击监听器放入您的PosterViewHolder
这是我的项目中的适配器,我的单击对我来说很好
/**
* Created by Rakshit on 7/20/2016.
*/
public class MyWishListAdapter extends RecyclerView.Adapter<MyWishListAdapter.DataViewHolder> {
private List<UserWishlist> mList;
Activity mContext;
MyWishListFragment fragment;
public MyWishListAdapter(Activity mContext, MyWishListFragment fragment) {
mList = new ArrayList<>();
this.mContext = mContext;
this.fragment = fragment;
}
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_wishlist_table_row_item, parent, false);
Constants.setAppFont((ViewGroup) v, parent.getContext());
DataViewHolder dataView = new DataViewHolder(v);
return dataView;
}
@Override
public void onBindViewHolder(final DataViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return mList.size();
}
public class DataViewHolder extends RecyclerView.ViewHolder implements APIServerResponse {
public DataViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//View click listener here
}
});
}
}
/**
*由Rakshit于2016年7月20日创建。
*/
公共类MyWishListAdapter扩展了RecyclerView.Adapter{
私人名单;
活动mContext;
粘虫碎片;
公共MyWishListAdapter(活动mContext,MyWishListFragment){
mList=新的ArrayList();
this.mContext=mContext;
this.fragment=片段;
}
@凌驾
public DataViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.my\u wishlist\u table\u row\u item,parent,false);
Constants.setAppFont((ViewGroup)v,parent.getContext());
DataViewHolder dataView=新的DataViewHolder(v);
返回数据视图;
}
@凌驾
公共无效onBindViewHolder(最终数据视图持有人,内部位置){
}
@凌驾
public int getItemCount(){
返回mList.size();
}
公共类DataViewHolder扩展了RecyclerView。ViewHolder实现了APIServerResponse{
公共数据视图持有者(视图v){
超级(五);
v、 setOnClickListener(新视图。OnClickListener(){
@凌驾
公共空间点击(Vi)