2016-11-17 55 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) { 

      ....... 
     } 
相關問題