如何更改特定的(具有特殊价值的)RecyclerView的imageview显示

时间:2019-05-19 09:00:04

标签: android xml android-recyclerview adapter

我正在为毕业项目申请公交车。 我有两个总线信息api,并使用RecyclerView来显示这些信息。

当此位置(?)的RecyclerView具有特殊的跟踪器值时,我想显示隐藏的图像视图。所以我只用

holder.tv_buspointer.setVisibility(View.VISIBLE);

显示。

我不确定它是否可以工作,因此我将跟踪器值放在最后一个Arraylist(在适配器中使用)中。我必须滚动到屏幕的末尾以查看可见的imageview。在我滚动到上侧之前,一切看上去都找到了。一些recyclerview的imageview也出现了。当我向上滚动时,我会看到很多看不见的imageview出现。

我认为recyclerview中的onBindViewHolder方法有问题。 你们能帮我吗?

谢谢。

package com.example.absin.firebasebus;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by absin on 2019-05-17.
 */

class station_after {  //노선이 가지고 있는 정류장을 모두 출력하기 위해 만든 클래스
    String stationId; //정류소 아이디
    String mobileNo; //정류소 번호
    String stationName;
    int tracker =0;


    public String getStationId() { return stationId; }
    public String getMobileNo() { return mobileNo; }
    public String getStationName() { return stationName; }

    public int getTracker() { return tracker; }


    public void setStationId(String stationId) { this.stationId = stationId; }
    public void setStationName(String stationName) { this.stationName = stationName; }
    public void setMobileNo(String mobileNo) { this.mobileNo = mobileNo; }

    public void setTracker(int tracker) {this.tracker = tracker; }
}

class station_tracker { //이 클래스의 용도에 대한 자세한 설명은 Station_After_Number의 MySyncTask3 class 바로 위에 작성해두었다.
    String stationId;

    public String getStaionId() { return stationId;}

    public void setStationId(String stationId) {this.stationId= stationId;}
}


public class AdapterSAN extends RecyclerView.Adapter<AdapterSAN.MyViewHolder> {

    private ArrayList<station_after> mList;
    private LayoutInflater mInflate;
    private Context mContext;
    View view;

    public AdapterSAN(Context context, ArrayList<station_after> itmes) {
        this.mList = itmes;
        this.mInflate = LayoutInflater.from(context);
        this.mContext = context;
    }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         view = mInflate.inflate(R.layout.san_iten, parent, false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    @Override
    //뷰에 값이 채워질 3개를 여기서 하는 것
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {

          holder.tv_stationName.setText(mList.get(position).stationName);



        holder.tv_buspointer.setVisibility(View.VISIBLE);
        //Click event
    }

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

    //ViewHolder
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_stationName;
        public ImageView tv_buspointer;


        public MyViewHolder(View itemView) {
            super(itemView);

            tv_stationName = itemView.findViewById(R.id.tv_stationname2);
            tv_buspointer = itemView.findViewById(R.id.tv_image);

        }
    }

}

1 个答案:

答案 0 :(得分:0)

RecyclerView从其他位置(因此而得名)回收视图。

请确保您的onBindViewHolder可以处理这种情况,以便以前绑定到满足条件并显示imageView的位置的ViewHolders在重新用于不符合条件的项目时会正确隐藏它。

if(condition)
    holder.tv_buspointer.setVisibility(View.VISIBLE);
else
    holder.tv_buspointer.setVisibility(View.GONE);