получение ошибки нулевого объекта для использования нескольких макетов в recyclerView - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь использовать два макета для своих элементов RecyclerView, и я написал этот код для своих целей.Это должно изменить расположение в нечетных и четных базовых числах

public class WordListAdaptor extends RecyclerView.Adapter<WordListAdaptor.ViewHolder>{

private Context context;
private List<Word> words;
public int counter = 1;

public WordListAdaptor(Context context, List<Word> words){

    this.context = context;
    this.words = words;

}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    if ( this.counter % 2 == 0) {
        view = LayoutInflater.from(this.context).inflate(R.layout.search_listview_gray, parent, false);
    } else{
    view = LayoutInflater.from(this.context).inflate(R.layout.search_listview_blue,parent,false);}

    this.counter ++;

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    if ( this.counter % 2 == 0)

        holder.textViewGray.setText(words.get(position).getOrginalWord() + " Pos : " + position);

    else
        holder.textViewBlue.setText(words.get(position).getOrginalWord() + " Pos : " + position);


}

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

class ViewHolder extends RecyclerView.ViewHolder{

    private TextView textViewBlue;
    private TextView textViewGray;
    private ImageButton blueItemStar;
    private ImageButton grayItemStar;

    public ViewHolder(View itemView) {
        super(itemView);
        textViewBlue = itemView.findViewById(R.id.listView_item_textView_blue);
        textViewGray = itemView.findViewById(R.id.listView_item_textView_gray);
        blueItemStar = itemView.findViewById(R.id.blue_item_star);
        grayItemStar = itemView.findViewById(R.id.gray_item_star);
    }
}
}

Но для этого кода я получаю эту ошибку

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

для одного макета это работает хорошо, но после добавленияусловие для изменения файла макета, я получаю ошибку.

1 Ответ

0 голосов
/ 03 июня 2018

Я не уверен, что вы можете положиться на тот факт, что в держателях, которые вы создаете в onCreateViewHolder, будут храниться одинаковые виды для тех же позиций в onBindViewHolder, после того как цель представления переработчика состоит в том, чтобы повторно использовать виды,По сути, вы можете получить предыдущих держателей просмотра, которые вышли за пределы экрана, и вам придется их переработать.Очисти штат и поставь новый.Возможно, вам повезет, что они содержат нужные вам представления, но вы не можете.Когда у вас есть 2 или более разных вида, обычно подход состоит в том, чтобы использовать типы представлений - см. Этот ответ .

. В любом случае, давайте предположим, что вы можете быть уверены, что держатель будет иметьвид вы ожидаете.Допустим, ваш взгляд переработчика имеет 1 элемент.Это выражение this.counter % 2 == 0 оценивается как true, и вы создаете держатель для «серого» вида.Затем вы увеличиваете значение counter - this.counter ++;.Вызывается onBindViewHolder и оценивается то же условие, но теперь выясняется, что counter странно, и вы пытаетесь получить доступ к подпредставлениям своего "синего" представления, которые на самом деле никогда не были раздутыми.Это вызывает исключение нулевого указателя в holder.textViewBlue.setText.

Я предлагаю проверить типы представлений и реализовать их для вашего варианта использования.

...