2016-05-02 2 views
0

При отладке мое приложение, я заметил, что мой RecyclerView дисплей несовместим с при условии, что данные, т.е.RecyclerView элемент, показывающий противоречивые данные

  • Если установить сигнализацию (TextView в RecyclerView есть дата набора), затем прокрутить мой RecyclerView, дата отображается в неправильных позициях, например, если я установить дату на 4 пункта, то третий пункт также имеет дату установки, а по какой-то причине

  • Я также заметил, что иногда, например, Только 3rd и 5th В списке объектов в наборе данных воспроизводится анимация, а 4th is not. Я проверил журналы, и кажется, что onBindViewHolder() не вызывается для 4-го элемента, только 3-й и 5-й. Я здесь что-то не так?

Я посмотрел на documentation, но я не уверен, как пропатчить соответственно. Вы можете мне помочь?

Мой onBindViewHolder:

@Override 
public void onBindViewHolder(final RecyclerVH recyclerVH, final int position) { 
    currentNote = data.get(position); 
    final String currentTitle = currentNote.getTitle(); 
    final String currentContent = currentNote.getContent(); 
    final int currentPosition = currentNote.getPosition(); 
    String currentAlarmDate = currentNote.getAlarm(); 

    Log.d("RecyclerView", "onBindVH called: " + currentTitle); 
    Log.d("RecyclerView", "Position at: " + currentPosition + " and Adapter Position at: " + recyclerVH.getAdapterPosition()); 

    // final Info currentObject = data.get(position); 
    // Current Info object retrieved for current RecyclerView item - USED FOR DELETE 
    recyclerVH.listTitle.setText(currentTitle); 
    recyclerVH.listContent.setText(currentContent); 
    Log.d("RecyclerAdapter", "currentAlarmDate is: '" + currentAlarmDate + "'"); 
    if (currentAlarmDate != null && !currentAlarmDate.equals(" ")) { 
     Log.d("RecyclerAdapter", "Current Alarm set for: " + currentAlarmDate); 
     recyclerVH.alarm.setText(currentAlarmDate); 
    } 

    recyclerVH.pencil.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("User Interface", "updateNoteInfo called!"); 
      // Opens Dialog to update Note and Alarm 
      // TODO Open Activity instead 

      //final View updateButton; 
      // NEEDS TO BE DECLARED AT TOP, SO IT IS SEEN EVERYWHERE 


      updateDialog = new MaterialDialog.Builder(context) 
        .title(R.string.rewrite_note) 
        .customView(R.layout.note_update_screen, false) 
        .positiveText(R.string.update) 
        .negativeText(R.string.nevermind) 
        .forceStacking(false) 
        .cancelable(false) 
        .canceledOnTouchOutside(false) 
        .onPositive(new MaterialDialog.SingleButtonCallback() { 
         @Override 
         public void onClick(MaterialDialog dialog, DialogAction which) { 
          updatedTitle = updateTitle.getText().toString(); 
          updatedContent = updateContent.getText().toString(); 
          updateNote(updatedTitle, updatedContent, recyclerVH.getAdapterPosition()); 
         } 
        }) 
        .build(); 
      //noinspection ConstantConditions 
      updateTitle = (EditText) updateDialog.getCustomView().findViewById(R.id.updateNoteTitle); 
      updateContent = (EditText) updateDialog.getCustomView().findViewById(R.id.updateNoteContent); 
      // Set the text for the title using current info 
      updateTitle.setText(currentTitle); 
      updateTitle.setSingleLine(false); 
      updateTitle.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 

      updateContent.setText(currentContent); 
      updateContent.setSingleLine(false); 
      updateContent.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 
      updateButton = updateDialog.getActionButton(DialogAction.POSITIVE); 

      // TODO Use do-while loop for onTextChanged? 
      // TODO Use Thread? 
      updateDialog.show(); 
      // updateButton.setEnabled(false); 
     } 
    }); 
    runEnterAnimation(recyclerVH.itemView, position); 
} 

ответ

1

RecyclerView С повторно или перерабатывает взгляды, вы всегда должны добавить else условие, чтобы убедиться, что он работает должным образом. Итак, добавьте блок else вместе с блоком if.

1

Удалить setOnClickListener() из onBindViewHolder и установите setOnClickListener() внутри ViewHolder RecyclerVH. Чтобы получить позицию щелкнутого элемента или строки, вызовите метод getAdapterPosition(). Пример:

public class ReservationViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
    // each data item is just a string in this case 
    CardView cardView; 

    public ReservationViewHolder(View v) { 
     super(v); 
     cardView = (CardView) v.findViewById(R.id.cv); 
     cardView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int position = getAdapterPosition(); 
     // do what you want... 
    } 
} 
+0

Это полезно, но как вы знаете, как решить свой вопрос? –

+0

Вы пробовали? –

+0

Да, это похоже на более эффективный setOnClickListener, но это не похоже на упорядочение проблемы RecyclerView. –

Смежные вопросы