从 RecyclerView.ViewHolder 调用 notifyItemChanged(int position) 或等价物

Call notifyItemChanged(int position) or equivalent from RecyclerView.ViewHolder

我的 RecyclerView 项包含具有 4 个 TextView 的视图。我通过实施 onClick(View view) 将 2 个 TextViews 的 View.visibility 分别设置为 View.GONEView.VISIBILITY,从而 "collapse" 和 "expand" 每个视图项。我知道我必须在 collapse/expand 之后调用我的 RecyclerView 适配器的 notifyItemChanged(int position) 函数,但问题是视图项的 position 不能(通常)从其 [=19 访问=].

作为解决方法,我在视图项目中创建了第 5 个 TextView 来保存项目的 position。我从传递给 onClick() 的视图访问此文本视图,从而获得我用来调用 notifyItemChanged(position) 和更新屏幕的项目的位置。

我的解决方案有效,但我正在寻找更清洁的解决方案。使用视图来保存项目位置绝对不是一个好主意

这是我的代码的重要部分:

public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapter.NotificationHolder> {
    Context context;
    List<Notification> notifications;
    // Notification is my custom class (POJO)
    public NotificationAdapter(Context context, List<Notification> notificationList) {
        this.context = context;
        this.notifications = notificationList;
    }
    public class NotificationHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        View view;
        //The 4 TextViews
        TextView titleTv, descTv, timeTv,extraTv;
        //TextView added to hold position of the view item
        TextView positionJugad;
        public NotificationHolder(View itemView) {
            super(itemView);
            titleTv = itemView.findViewById(R.id.notification_subject_tv);
            descTv = itemView.findViewById(R.id.notification_body_tv);
            timeTv = itemView.findViewById(R.id.notification_time_tv);
            extraTv = itemView.findViewById(R.id.notification_extra_info_tv);
            positionJugad = itemView.findViewById(R.id.notification_view_position);
            itemView.setOnClickListener(this);
            this.view = itemView;
        }
        public void bindNotification(Notification notification, int position){
            titleTv.setText(notification.getTitle());
            descTv.setText(notification.getDescription());
            timeTv.setText(notification.getTime();
            extraTv.setText(notification.getExtra());
            positionJugad.setText(""+position);
        }
        public void collapseView(){
            descTv.setVisibility(View.GONE);
            extraTv.setVisibility(View.GONE);
        }
        public void expandView(){
            descTv.setVisibility(View.VISIBLE);
            extraTv.setVisibility(View.VISIBLE);
        }
        @Override
        public void onClick(View view){
            //get the textview that stores position
            TextView jugad = view.findViewById(R.id.notification_view_position);
            if(descTv.getVisibility()==View.GONE){
                expandView();
            }
            else collapseView();
            notifyViewToggle(Integer.parseInt(jugad.getText().toString()));
        }
    }
    @Override
    public NotificationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.notification_item,parent,false);
        return new NotificationHolder(view);
    }

    @Override
    public void onBindViewHolder(NotificationHolder holder, int position) {
        Notification notification = notifications.get(position);
        holder.bindNotification(notification,position);
    }
    //To change view state from collapsed to expanded and vice versa
    public void notifyViewToggle(int position){

            notifyItemChanged(position);
    }

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

您不必使用其他文本视图来存储位置。相反,使用

getAdapterPosition()

它为您提供了当前的 adapter 位置。

您的 onClick 应如下所示

@Override
        public void onClick(View view){
            if(descTv.getVisibility()==View.GONE){
                expandView();
            }
            else collapseView();
            notifyViewToggle(getAdapterPosition());
        }

并修改notifyViewToggle为这个

notifyViewToggle(int position)