【问题标题】:Android Recycler View AdapterAndroid 回收器视图适配器
【发布时间】:2016-11-23 07:06:22
【问题描述】:

我正在构建一个RecyclerView 来显示我的数组列表项,我确实创建了点击监听器,但是当我实现onClick 方法时,我无法从那里更新我的视图。|这是我的RecyclerView适配器

public class FeedRecyclerAdapter extends RecyclerView.Adapter<FeedRecyclerAdapter.ViewHolder> {
    public static ArrayList<FeedObject> feedObjectArrayList;

    @Override
    public FeedRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feeditemlayout, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        return viewHolder;
    }


    @Override
    public void onBindViewHolder(final FeedRecyclerAdapter.ViewHolder holder, int position) {

        final FeedObject feedObject = feedObjectArrayList.get(position);


        holder.likeFeedItemTV.setText(feedObject.getNumAgree() + "");
        holder.dislikeFeedItemTV.setText(feedObject.getNumDisAgree() + "");
        holder.commentFeedItemTV.setText(feedObject.getNumComments() + "");
        holder.mediaFeedItemTV.setText(feedObject.getMediaSize() + "");


    }
    @Override
    public int getItemCount() {
        return feedObjectArrayList.size();
    }

    public FeedRecyclerAdapter(ArrayList<FeedObject> feedObjectArrayList) {
        this.feedObjectArrayList = feedObjectArrayList;
    }


    public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
        private ImageView likeFeedItem, profileImageView, likeFeedItemIV, dislikeFeedItem, commentFeedItem, mediaFeedItem;
        private TextView personName, personDetails, cat_Info_Feed_Item, descriptionFeedItemTV, likeFeedItemTV, dislikeFeedItemTV, commentFeedItemTV, mediaFeedItemTV, agreeFeed, disagreeFeed, commentFeed, mediaFeed;
        private ImageButton moreOption;
        private Button seeMore;

        public ViewHolder(View itemView) {
            super(itemView);

            likeFeedItemTV = (TextView) itemView.findViewById(R.id.likeFeedItemTV);
            dislikeFeedItemTV = (TextView) itemView.findViewById(R.id.dislikeFeedItemTV);
            commentFeedItemTV = (TextView) itemView.findViewById(R.id.commnetFeedItemTV);
            mediaFeedItemTV = (TextView) itemView.findViewById(R.id.mediaFeedItemTV);

            likeFeedItem = (ImageView) itemView.findViewById(likeFeedItemIB);
            dislikeFeedItem = (ImageView) itemView.findViewById(dislikeFeedItemIV);
            commentFeedItem = (ImageView) itemView.findViewById(commentFeedItemIV);
            mediaFeedItem = (ImageView) itemView.findViewById(mediaFeedItemIV);
            agreeFeed = (TextView) itemView.findViewById(agreeFeedTV);
            disagreeFeed = (TextView) itemView.findViewById(disagreeFeedTV);
            commentFeed = (TextView) itemView.findViewById(commentFeedTV);
            mediaFeed = (TextView) itemView.findViewById(commentFeedTV);


            likeFeedItem.setOnClickListener(this);
            dislikeFeedItem.setOnClickListener(this);
            commentFeedItem.setOnClickListener(this);
            mediaFeedItem.setOnClickListener(this);
            agreeFeed.setOnClickListener(this);
            disagreeFeed.setOnClickListener(this);
            commentFeed.setOnClickListener(this);
            mediaFeed.setOnClickListener(this);

            seeMore = (Button) itemView.findViewById(seeMoreFeedItemTV);
            moreOption = (ImageButton) itemView.findViewById(moreFeedItemIB);
            seeMore.setOnClickListener(this);
            moreOption.setOnClickListener(this);
            itemView.setOnClickListener(this);


        }

        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {


                default:
                    return false;
            }
        }

        @Override
        public void onClick(View v) {
            final FeedObject feedObject = feedObjectArrayList.get(getAdapterPosition());

            switch (v.getId()) {
                case moreFeedItemIB:
                    PopupMenu popupMenu = new PopupMenu(v.getContext(), v);
                    MenuInflater menuInflater = popupMenu.getMenuInflater();
                    menuInflater.inflate(R.menu.feeditemmenu, popupMenu.getMenu());
                    popupMenu.show();
                    break;
                case likeFeedItemIB:
                case agreeFeedTV:
                    new AsyncTask() {
                        @Override
                        protected Object doInBackground(Object[] params) {
                            Boolean b=feedObject.isAgree();
                            if (b != null ) {
                                if (b) {
                                    feedObject.setAgree(null);
                                    feedObject.setNumAgree(feedObject.getNumAgree() - 1);
                                } else {
                                    feedObject.setAgree(true);
                                    feedObject.setNumAgree(feedObject.getNumAgree() + 1);
                                    feedObject.setNumDisAgree(feedObject.getNumDisAgree() - 1);
                                }
                            } else {
                                feedObject.setAgree(true);
                                feedObject.setNumAgree(feedObject.getNumAgree() + 1);
                            }

                            return null;
                        }


                    }.execute();

                   //here is my problem i can't update my view 
                    break;
                case dislikeFeedItemIV:
                case disagreeFeedTV:
                    new AsyncTask() {
                        @Override
                        protected Object doInBackground(Object[] params) {
                            Boolean c=feedObject.isAgree();
                            if (c != null ) {
                                if (c) {
                                    feedObject.setAgree(false);

                                    feedObject.setNumAgree(feedObject.getNumAgree() - 1);
                                    feedObject.setNumDisAgree(feedObject.getNumDisAgree()+ 1);
                                } else {
                                    feedObject.setAgree(null);
                                    feedObject.setNumAgree(feedObject.getNumAgree() - 1);

                                }
                            } else {
                                feedObject.setAgree(false);
                                feedObject.setNumDisAgree(feedObject.getNumDisAgree() + 1);
                            }
                            return null;
                        }
                    }.execute();

                    break;
                case seeMoreFeedItemTV:
                case commentFeedItemIV:
                case commentFeedTV:
                    v.getContext().startActivity( new Intent(v.getContext(),DetailedFeed.class));

                    break;
                case mediaFeedItemIV:
                case mediaFeedTV:
                    break;


            }


        }




    }
}

【问题讨论】:

  • 尝试在onBindViewHolder方法中设置onClick监听器。

标签: android arraylist android-recyclerview


【解决方案1】:

您将 ViewHolder 设为静态是否有原因?如果您删除静态,则可以从适配器notifyItemChanged(getAdapterPosition()); 中调用以更新您的视图。然后通过删除 ViewHolder 上的静态,您也可以将其从 feedObjectArrayList 中删除。

如果你想让它保持静态,你可以在适配器中创建一个实现OnClickListener 的新类,并将它传递给onBindViewHolder 中的 ViewHolder。

作为旁注,我不得不说,onClick 方法对于可读性来说是一场噩梦,我会亲自将它分解成单独的类,以针对你所拥有的每个案例。

【讨论】:

  • 我使用静态 viewHolder 在内存中加载一次。正如您在上面的代码中看到的,我想在适配器内使用 onclick,所以如果有什么方法可以做到这一点
  • 这不是它的工作原理,您仍在创建该类的多个实例,每个实例都占用内存。视图持有者是静态的只是意味着它不持有对其父类的引用,在这种情况下是适配器
猜你喜欢
  • 2016-04-05
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多