繁体   English   中英

RecyclerView-如何更新适配器数据

[英]RecyclerView - How to update adapter data

ScheduleAdapter ,我显示一个具有扩展/折叠行功能的列表。 ViewHolderimgToggle.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM