2016-11-17 56 views
0

我正试图在Android上实现onClick侦听器。当我点击时,我需要从GridLayoutManager中获得一个特定项目的详细信息。 onClick工程但它列出阵列列表中的所有项目。 适配器类:Android onClickItem在RecyclerView上不工作

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

} 

我想,上ViewHolder类以及其延伸RecyclerView.ViewHolder与API中规定的getAdapterPosition()。我得到了另一个活动/片段的意图,但我没有得到点击的项目的位置,而是让整个列表加载。这里是Github project linkListViewOnItemClickListnerArrayAdapterRecyclerView缺少功能。

非常感谢您的帮助。

+0

我们展示完整的代码视图holder类里面的点击将工作罚款 –

+0

更新了适配器类。 'onClick'的作品,但我没有得到的位置单个项目的细节,当我点击'GridView'中的图像 – Ronan

+0

放最终电影电影= movieItems.get(位置);这些代码在onClickListener中的位置无可争辩地是相同的 – Bali

回答

1

点击监听里面你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 
        } 
       });  
    } 
} 
+0

我有这个@ @Override public PosterViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ View view = LayoutInflater.from(parent.getContext())。inflate(R.layout .movi​​es_poster_grid_view_item,parent,false); return new PosterViewHolder(view); }'。 – Ronan

+0

将你的点击监听器放置在PosterViewHolder中,就像我在我的DataViewHolder类中一样 –

+0

@Ronan:是否为你工作? –

0

你的方法是错误的尝试这样的事情。

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) { 

    } 
} 

}

而在你的片段/活动

yourClassAdapter.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int position = recyclerView.getChildAdapterPosition(v); 
      //Do your things 
     } 
    }); 
1

落实ClickListener

public class MoviesGridAdapter extends RecyclerView.Adapter<MoviesGridAdapter.PosterViewHolder> implements View.OnClickListener { 

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

     @Override 
     public void onClick(View v) { 

      ....... 
     } 
相关问题