【问题标题】:Android onClickItem is not working on RecyclerViewAndroid onClickItem 不适用于 RecyclerView
【发布时间】:2016-11-17 23:56:16
【问题描述】:

我正在尝试在 Android 上实现 onClick 侦听器。当我单击时,我需要从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();
    }

}

我也在 ViewHolder 类上尝试过,它使用 API 中声明的 getAdapterPosition() 扩展了 RecyclerView.ViewHolder。我得到了另一个 Activity/Fragment 的意图,但我没有得到点击项目的位置,而是加载了整个列表。这是Github project linkListViewOnItemClickListnerArrayAdapterRecyclerView 缺少功能。

提前感谢您的所有帮助。

【问题讨论】:

  • 向我们展示完整的代码,因为在视图持有者类中点击可以正常工作
  • 更新了适配器类。 onClick 有效,但是当我单击GridView 中的图像时,我没有获得单个项目详细信息的位置@
  • 放入最终电影 movies = movieItems.get(position); onClickListener 中的这些代码,因此位置无疑是相同的

标签: android android-recyclerview onclicklistener


【解决方案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  
                    }
                });     
    }
}

【讨论】:

  • 我有这个@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); }
  • 像我在 DataViewHolder 类中所做的一样,将您的点击监听器放在 PosterViewHolder 中
  • 正在实施。它不断获取 ArrayList 中的所有大小。 Ans 无论我点击哪个项目,我都会得到列表中的第一个显示。为什么要在 Adapter 类中发送 Fragment 作为参数?
【解决方案2】:

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

           .......
        }

【讨论】:

    【解决方案3】:

    你的方法是错误的,试试这样。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多