RecyclerView项目显示不一致的数据

时间:2016-05-02 10:43:05

标签: android android-recyclerview

在调试我的应用程序时,我注意到我的RecyclerView显示与提供的数据不一致,即

  • 如果我设置闹钟(RecyclerView中的TextView设置了日期)然后滚动我的RecyclerView,日期显示在错误的位置,例如,如果我在第4项设置日期,那么第3项也因某种原因设置了日期

  • 我有时也注意到,例如只有第三第五 -last项目才会播放动画,而 4th不会。我检查了日志,看来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);
}

2 个答案:

答案 0 :(得分:1)

从onBindViewHolder中删除setOnClickListener()并在ViewHolder RecyclerVH中设置setOnClickListener()。要获取单击项或行的位置,请调用getAdapterPosition()方法。例如:

self

答案 1 :(得分:1)

由于RecyclerView重复使用或回收视图,因此必须始终添加else条件以确保其正常工作。因此,请添加else块以及if块。