当前位置: 首页 > 知识库问答 >
问题:

显示不一致数据的RecycerView项

章飞章
2023-03-14

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

>

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

    我已经查看了文档,但不确定如何相应地修补。你能帮我吗?

    我的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个答案

    潘振国
    2023-03-14

    从onBindViewHolder中删除setOnClickListener(),并在ViewHolder RecyclerVH中设置setOnClickListener()。要获取被单击的项或行的位置,请调用方法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...
        }
    }
    
     类似资料:
    • 我怀疑原因可能是在ViewHolder中连接字符串,根据我所读到的(检查底部的引用),这应该使用带有占位符的资源字符串来完成,例如 应替换为 其中包括。 https://developer.android.com/guide/topics/resources/string-resource#formattingandstyling https://developer.android.com/ref

    • 我试图显示firebase realtime数据库中的项,我在数据库中有两个节点,我在适配器类函数上使用了Log方法,它显示有2个,但它没有显示在我的UI中,两项视图正在生成,但没有显示带有名称和mob的内容。

    • null 然而,ItemAnimator并不区分添加和出现。是否有可能修复预测动画或至少使出现的动画看起来像“从屏幕外移动动画”离开添加的动画原样?

    • 问题内容: 我正在尝试填写从GET请求中收到的一些数据。我不知道为什么,但是如果在我的中,我返回一个特定的值(例如8),它表示信息。如果y返回请求填充的数组的值,则不添加任何行: 知道为什么会这样吗?非常感谢你!! 更新! 我解决了这个问题,在loadUserData()函数内的complete()之后添加了self.tableView.reloadData()。希望能帮助到你! 问题答案: 快速

    • 我正在尝试jQuery数据表控件。问题是我不能显示数据。 HTML是: 如果我注释掉Ajax代码并取消注释 它很好用。变量是我使用firefox从服务中获取的JSON数据- 我读了很多帖子,尝试了很多东西,但都没能成功。有什么帮助吗?谢谢 编辑:服务代码: 《编辑》20150721:我对HTML代码做了一些修改,但有一个小错误。加载时,我在页面顶部看到了table元素的标题(ActivityHis