[英]RecyclerView - How to update adapter data
在ScheduleAdapter
,我显示一个具有扩展/折叠行功能的列表。 在ViewHolder
, imgToggle.setOnClickListener(...)
处理click事件。 一切正常。
问题是,当我滚动浏览列表时,列表下方的行(最初不可见)会自动展开。 例如,如果我单击列表中的第一项,则该行将展开。 当我滚动列表时,第六行(任意行:起初不可见)被扩展了(不应该)。
我了解RecyclerView在做什么。 只是不确定如何处理?
在我的代码中,我尝试使用scheduleDetailVisibility
来管理expand / collaspe行为。 这种方法行不通。
我可以采取的另一种方法是在ScheduleTrip
中添加一个属性,该属性可以管理当前行是否已扩展/折叠。 我将如何更新schedules
以便适配器知道更改?
public class ScheduleAdapter extends RecyclerView.Adapter<ScheduleAdapter.ViewHolder> {
private ArrayList<ScheduleTrip> schedules;
private int rowLayout;
private Context mContext;
public ScheduleAdapter(ArrayList<ScheduleTrip> schedules, int rowLayout, Context context) {
this.schedules = schedules;
this.rowLayout = rowLayout;
this.mContext = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
return new ViewHolder(v, mContext);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
ScheduleTrip schedule = schedules.get(i);
viewHolder.textViewRoute.setText(schedule.trip_id);
viewHolder.textViewTripHeadsign.setText(schedule.trip_name);
viewHolder.tableTimes.removeAllViews();
viewHolder.tableTimes.addView(buildTable(schedule.departure_time, i));
viewHolder.scheduleDetail.setVisibility(viewHolder.scheduleDetailVisibility);
}
@Override
public int getItemCount() {
return schedules == null ? 0 : schedules.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView textViewRoute;
public TextView textViewTripHeadsign;
public ImageView imgToggle;
public int scheduleDetailVisibility = View.GONE;
public LinearLayout scheduleDetail;
public LinearLayout tableTimes;
public ViewHolder(View itemView, final Context context) {
super(itemView);
scheduleDetailVisibility = View.GONE;
textViewRoute = (TextView) itemView.findViewById(R.id.textViewRoute);
textViewTripHeadsign = (TextView) itemView.findViewById(R.id.textViewTripHeadsign);
tableTimes = (LinearLayout) itemView.findViewById(R.id.tableTimes);
scheduleDetail = (LinearLayout) itemView.findViewById(R.id.scheduleDetail);
imgToggle = (ImageView) itemView.findViewById(R.id.imgToggle);
imgToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int visibility = scheduleDetail.getVisibility();
switch (visibility){
case View.GONE:
case View.INVISIBLE:
scheduleDetail.setVisibility(View.VISIBLE);
scheduleDetailVisibility = View.VISIBLE;
imgToggle.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_action_collapse));
break;
default:
scheduleDetail.setVisibility(View.GONE);
scheduleDetailVisibility = View.GONE;
imgToggle.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_action_expand));
break;
}
}
});
}
}
}
尝试这个
public ViewHolder(View itemView, final Context context) {
super(itemView);
scheduleDetailVisibility = View.GONE;
textViewRoute = (TextView) itemView.findViewById(R.id.textViewRoute);
textViewTripHeadsign = (TextView) itemView.findViewById(R.id.textViewTripHeadsign);
tableTimes = (LinearLayout) itemView.findViewById(R.id.tableTimes);
scheduleDetail = (LinearLayout) itemView.findViewById(R.id.scheduleDetail);
imgToggle = (ImageView) itemView.findViewById(R.id.imgToggle);
if (scheduleDetail.getTag()!=null){
if(((Boolean) scheduleDetail .getTag())){
scheduleDetail.setVisibility(View.VISIBLE);
}else{
scheduleDetail.setVisibility(View.GONE);
}
}else{
scheduleDetail.setVisibility(View.VISIBLE);
}
imgToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int visibility = scheduleDetail.getVisibility();
switch (visibility){
case View.INVISIBLE:
case View.GONE:
scheduleDetail.setVisibility(View.VISIBLE);
scheduleDetailVisibility = View.VISIBLE;
imgToggle.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_action_collapse));
scheduleDetail.setTag(true);
break;
default:
scheduleDetail.setVisibility(View.GONE);
scheduleDetailVisibility = View.GONE;
imgToggle.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_action_expand));
scheduleDetail.setTag(false);
break;
}
}
});
希望你解决了你的问题。 顺便说一句,我可以对您说,如果对Adapter级别进行更改而不是与View.Visibility进行斗争,而使用RecyclerView实施可扩展列表视图,则可以更轻松,可控。 我的建议是,在单击sopme可扩展项时,只需在适当的位置添加新项并使用RecyclerView.OnItemInserted( )api。 类似于折叠列表Item。只需从适配器的主数据列表中删除项目,然后调用recyclerView.OnItemRangeRemoved(int intpos,int itemcount)。 我已经为零售应用的categoryActivity实现了此功能,其中某些类别是可扩展的。 RV的这些API的另一个优势是它们具有自己的动画,或者您可以针对项目的内部和外部自定义动画,从而提供更好的用户体验和更好的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.