Android 在recyclerview中更改视图

Android 在recyclerview中更改视图,android,android-recyclerview,Android,Android Recyclerview,我制作了一个应用程序,在其中我必须显示印度火车上的可用旅行班。。。。 此图显示了可用类的外观 每列火车都有不同的班次。。 我使用了六种不同的文本视图来显示可用的类 现在的问题是…一旦我滚动可用的类,这些类就会发生变化,变得像这样不正确 行没有得到正确更新,因为viewholder回收了视图…但是如何更正呢 这是适配器代码 public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.CustomV

我制作了一个应用程序,在其中我必须显示印度火车上的可用旅行班。。。。 此图显示了可用类的外观

每列火车都有不同的班次。。 我使用了六种不同的文本视图来显示可用的类

现在的问题是…一旦我滚动可用的类,这些类就会发生变化,变得像这样不正确

行没有得到正确更新,因为viewholder回收了视图…但是如何更正呢

这是适配器代码

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.CustomViewHolder> {

ClassType[] classTypes;
MyRecyclerAdapter.CustomViewHolder holder;
private List<Train> trainList;
private Context mContext;

public MyRecyclerAdapter(Context context, List<Train> feedItemList) {
    this.trainList = feedItemList;
    this.mContext = context;
}

@Override
public MyRecyclerAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, null);
    return new CustomViewHolder(view);
}

@Override
public void onBindViewHolder(final MyRecyclerAdapter.CustomViewHolder holder, int position) {
    this.holder = holder;
    final Train train = trainList.get(position);

    holder.expandableLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (holder.imageView.getTag().toString().equals("down")) {
                holder.imageView.setImageResource(R.drawable.uparrow);
                holder.imageView.setTag("up");
            } else {
                holder.imageView.setImageResource(R.drawable.downarrow);
                holder.imageView.setTag("down");
            }
        }
    });

    holder.trainNumber.setText(train.getNumber());
    holder.trainName.setText(train.getName());
    holder.from.setText(train.getFrom().getCode());
    holder.to.setText(train.getTo().getCode());
    holder.srcTime.setText(train.getSrc_departure_time());
    holder.destTime.setText(train.getDest_arrival_time());
    classTypes = train.getClasses();

    for (ClassType classType : classTypes) {
        switch (classType.getClass_code()) {
            case "1A":
                if (!classType.getAvailable().equals("Y"))
                    holder.firstac.setVisibility(View.GONE);
                break;
            case "2A":
                if (!classType.getAvailable().equals("Y"))
                    holder.secondac.setVisibility(View.GONE);
                break;
            case "3A":
                if (!classType.getAvailable().equals("Y"))
                    holder.thirdac.setVisibility(View.GONE);
                break;
            case "SL":
                if (!classType.getAvailable().equals("Y"))
                    holder.sleeper.setVisibility(View.GONE);
                break;
            case "2S":
                if (!classType.getAvailable().equals("Y"))
                    holder.secondseating.setVisibility(View.GONE);
                break;
            case "CC":
                if (!classType.getAvailable().equals("Y"))
                    holder.chaircar.setVisibility(View.GONE);
                break;
        }
    }
}

@Override
public int getItemCount() {
    return (null != trainList ? trainList.size() : 0);
}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    protected TextView trainNumber, trainName, from, srcTime, to, destTime, firstac, secondac, thirdac, sleeper, secondseating, chaircar;
    protected ExpandableLayout expandableLayout;
    protected ImageView imageView;
    protected LinearLayout availableClasses;

    public CustomViewHolder(View view) {
        super(view);
        this.trainNumber = (TextView) view.findViewById(R.id.trainNumber);
        this.expandableLayout = (ExpandableLayout) view.findViewById(R.id.expand);
        this.trainName = (TextView) view.findViewById(R.id.trainName);
        this.from = (TextView) view.findViewById(R.id.from);
        this.srcTime = (TextView) view.findViewById(R.id.sourceTime);
        this.to = (TextView) view.findViewById(R.id.to);
        this.destTime = (TextView) view.findViewById(R.id.destTime);
        this.imageView = (ImageView) view.findViewById(R.id.arrow);
        this.availableClasses = (LinearLayout) view.findViewById(R.id.availableClasses);
        this.firstac = (TextView) view.findViewById(R.id.firstac);
        this.secondac = (TextView) view.findViewById(R.id.secondac);
        this.thirdac = (TextView) view.findViewById(R.id.thirdac);
        this.sleeper = (TextView) view.findViewById(R.id.sleeper);
        this.secondseating = (TextView) view.findViewById(R.id.secondseating);
        this.chaircar = (TextView) view.findViewById(R.id.chaircar);
    }
}
公共类MyRecyclerAdapter扩展了RecyclerView.Adapter{
ClassType[]类类型;
MyRecyclerAdapter.CustomViewHolder;
私人名单列车名单;
私有上下文;
公共MyRecyclerAdapter(上下文,列表feedItemList){
this.trainList=feedItemList;
this.mContext=上下文;
}
@凌驾
public MyRecyclerAdapter.CustomViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext()).flate(R.layout.list_行,null);
返回新的CustomViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(最终MyRecyclerAdapter.CustomViewHolder,int位置){
这个.holder=holder;
最终列车=列车列表。获取(位置);
holder.expandableLayout.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
if(holder.imageView.getTag().toString().equals(“down”)){
holder.imageView.setImageResource(R.drawable.uparrow);
holder.imageView.setTag(“up”);
}否则{
holder.imageView.setImageResource(R.drawable.downarrow);
holder.imageView.setTag(“向下”);
}
}
});
holder.trainNumber.setText(train.getNumber());
holder.trainName.setText(train.getName());
holder.from.setText(train.getFrom().getCode());
holder.to.setText(train.getTo().getCode());
holder.srcTime.setText(train.getSrc_出发时间());
holder.destTime.setText(train.getDest_arrival_time());
classTypes=train.getClasses();
对于(类类型类类型:类类型){
开关(classType.getClass\u代码()){
案例“1A”:
如果(!classType.getAvailable().equals(“Y”))
holder.firstac.setVisibility(View.GONE);
打破
案例“2A”:
如果(!classType.getAvailable().equals(“Y”))
holder.secondac.setVisibility(视图已消失);
打破
案例“3A”:
如果(!classType.getAvailable().equals(“Y”))
holder.thirdac.setVisibility(视图已消失);
打破
案例“SL”:
如果(!classType.getAvailable().equals(“Y”))
支架。轨枕。设置可见性(视图。消失);
打破
案例“2S”:
如果(!classType.getAvailable().equals(“Y”))
支架。第二座。设置可见性(视图。消失);
打破
案例“CC”:
如果(!classType.getAvailable().equals(“Y”))
支架。椅子车。设置可见性(视图。消失);
打破
}
}
}
@凌驾
public int getItemCount(){
返回值(null!=trainList?trainList.size():0);
}
公共类CustomViewHolder扩展了RecyclerView.ViewHolder{
受保护文本视图车次号、车名、起始、srcTime、to、目的地时间、第一个AC、第二个AC、第三个AC、卧铺、第二个座位、轮椅车;
受保护的可扩展布局可扩展布局;
受保护的图像视图;
受保护的线性布局可用等级;
公共CustomViewHolder(视图){
超级(视图);
this.trainNumber=(TextView)view.findViewById(R.id.trainNumber);
this.expandableLayout=(expandableLayout)view.findViewById(R.id.expand);
this.trainName=(TextView)view.findViewById(R.id.trainName);
this.from=(TextView)view.findViewById(R.id.from);
this.srcTime=(TextView)view.findViewById(R.id.sourceTime);
this.to=(TextView)view.findViewById(R.id.to);
this.destTime=(TextView)view.findViewById(R.id.destTime);
this.imageView=(imageView)view.findviewbyd(R.id.arrow);
this.availableClasses=(LinearLayout)view.findViewById(R.id.availableClasses);
this.firstac=(TextView)view.findViewById(R.id.firstac);
this.secondac=(TextView)view.findViewById(R.id.secondac);
this.thirdac=(TextView)view.findViewById(R.id.thirdac);
this.sleeper=(TextView)view.findViewById(R.id.sleeper);
this.secondseating=(TextView)view.findViewById(R.id.secondseating);
this.chaircar=(TextView)view.findViewById(R.id.chaircar);
}
}
}


请首先帮助:

您对引用
持有者有一些模糊性
首先删除变量
持有者的成员类声明

MyRecyclerAdapter.CustomViewHolder

您不需要这样做,这可能会在您或适配器类处理视图时产生一些混合。从这个开始,看看你得到了什么

Second:与可见性相关的代码只隐藏视图,这会在某个列表项上隐藏视图时产生错误,即使该视图在其他项上应该可见,也不能这样做

因此,您应该首先显示所有相关视图(重置),然后执行
if-else
并隐藏应该隐藏的内容

在for循环开始之前添加此项

holder.firstac.setVisibility(View.VISIBLE);
holder.secondac.setVisibility(View.VISIBLE);
holder.thirdac.setVisibility(View.VISIBLE);
holder.sleeper.setVisibility(View.VISIBLE);
holder.secondseating.setVisibility(View.VISIBLE);
holder.chaircar.setVisibility(View.VISIBLE);

for (ClassType classType : classTypes) {
:
:

隐藏视图不会造成延迟,因为我已经隐藏了从未遇到过的视图。隐藏视图并在需要时显示是最好的方法。检查你还做错了什么。因为隐藏和显示视图不应该导致延迟。沙漏+1不应该导致延迟,也可以使用选项卡,