RecylerView Scrolling данные проблемы были изменены, когда RecylerView прокрутки вверх и вниз - PullRequest
2 голосов
/ 07 ноября 2019

Я приложил 2 изображения моего приложения, первое - нормальное изображение. Но когда я прокручиваю recyclerView, данные меняются, посмотрите на это второе изображение.

Вот когда это нормально enter image description here

ПослеЯ прокручиваю вверх и вниз enter image description here

вот мой код MainActivity.java

public class MainActivity extends AppCompatActivity {

    private  final String android_versions[]={
            "0",
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7",
            "8",
            "9",
            "10",
            "11",
            "12",
            "13",
            "14",
            "15",
            "16",
            "17",
            "18",
            "19",
            "20",
            "14",
            "15",
            "16",
            "17",
            "18",
            "19",
            "20"

    };
    RecyclerView recyclerView;
    ItemAdapter itemAdapter;
    LinearLayoutManager linearLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recylerview);
        itemAdapter = new ItemAdapter(MainActivity.this,android_versions);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(itemAdapter);
        recyclerView.setHasFixedSize(true);
        recyclerView.setNestedScrollingEnabled(false);


    }



}

Вот код адаптера Recylerview

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



    Context mcontext;
    String[] data;
    int counter = 1;

    public ItemAdapter(Context mcontext, String[] data) {
        this.mcontext = mcontext;
        this.data = data;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mcontext).inflate(R.layout.itemview, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.textView.setText(data[position]);
        if (counter == 1) {
            holder.textView.setBackgroundColor(Color.RED);
            counter = 2;
            holder.textView.setText("1");
        } else if (counter == 2) {
            holder.textView.setBackgroundColor(Color.GREEN);
            counter = 3;
            holder.textView.setText("2");
        } else if (counter == 3) {
            holder.textView.setBackgroundColor(Color.BLUE);
            counter = 1;
            holder.textView.setText("3");
        }
    }



    @Override
    public int getItemCount() {
        return data.length;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }
    }
}

Почему это происходит, когда я прокручиваю элементы в recylerview. Пожалуйста, направьте меня в этом вопросе.

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

Вы не можете использовать переменную типа counter, чтобы получить позицию вашего элемента в RecyclerView. Вы должны использовать переменную позиции, предоставленную в методе onBindViewHolder(), для согласованного поведения.

Короче говоря, вы должны решить, как должен выглядеть ваш вид, используя переменную position внутри метода onBindViewHolder().

Если вы хотите сделать первый макет красным и текст 1 и т. Д., Вы можете использовать что-то вроде этого внутри onBindViewHolder():

    int modulus = position % 3;
    switch (modulus){

        case 0:
            //handle logic for red
            break;
        case 1:
            //handle logic for green
            break;
        default:
            //handle logic for blue

    }
1 голос
/ 07 ноября 2019

Прежде чем мы решим эту проблему, давайте попытаемся понять, как работает представление переработчика.

Представление Recycler создает пул представлений и привязывает данные к этим представлениям.

теперь, когда вы вместо этого начинаете прокруткунадувая новые представления, он повторно использует представления, невидимые для пользователя

, теперь в вашем onBindViewHolder вы меняете счетчик при прокрутке вверх и вниз. Следовательно, когда вы снова достигнете вершины, счетчик уже изменился, и когда привязка данных завершена, появится что-то новое

, поэтому вместо этого попробуйте это

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.textView.setText(data[position]);
    int type = Integer.parseInt(data[position]);
    if (type%3 == 1) {
        holder.textView.setBackgroundColor(Color.RED);
        holder.textView.setText("1");
    } else if (type%3 == 2) {
        holder.textView.setBackgroundColor(Color.GREEN);
        holder.textView.setText("2");
    } else if (type%3 == 0) {
        holder.textView.setBackgroundColor(Color.BLUE);
        holder.textView.setText("3");
    }
}

Я думаю, что после этого все будет работать нормально.

0 голосов
/ 07 ноября 2019

вам нужно создать класс модели для вашего списка, как этот

public class AndroidVersions{
  String version;
  int color;
  // create constructor and getter setter for both 
}

теперь создайте список использования этого класса

ArrayList<AndroidVersions> android_versions = new ArrayList();

добавить значения, такие как

android_versions.add(new AndroidVersions("0", Color.RED));
android_versions.add(new AndroidVersions("1", Color.GREEN));
android_versions.add(new AndroidVersions("2", Color.BLUE));
.
.
.
.

и передайте это в recyclerView

в переработчике. Пишите код наподобие этого

holder.textView.setText(data[position]);
  holder.textView.setBackgroundColor(list.get(position).getColor());
  holder.textView.setText(list.get(position).getVersion());
}
...