从 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.GONE
和 View.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)
我的 RecyclerView
项包含具有 4 个 TextView 的视图。我通过实施 onClick(View view)
将 2 个 TextViews 的 View.visibility 分别设置为 View.GONE
和 View.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)