Android 在添加第三个项目后动态添加时,RecylerView不会按顺序列出项目

Android 在添加第三个项目后动态添加时,RecylerView不会按顺序列出项目,android,android-recyclerview,Android,Android Recyclerview,我有一个按钮,上面写着“添加项目” 下面是一个回收视图 当你点击additem时,它会将EDITVIEW添加到回收器视图中。您在其中键入文本,然后再次单击additem,它将另一个EDITVIEW添加到recyler视图中 一切都井然有序 当您第四次单击“添加项目”时,它不会在第四个位置添加,而是在第1个位置添加,并将前3个项目向下移动1 这可能是什么原因造成的 主要活动 package com.app.bowling.animalsrecycler; import android.app.

我有一个按钮,上面写着“添加项目”

下面是一个
回收视图

当你点击
additem
时,它会将
EDITVIEW
添加到回收器视图中。您在其中键入文本,然后再次单击
additem
,它将另一个
EDITVIEW
添加到recyler视图中

一切都井然有序

当您第四次单击“添加项目”时,它不会在第四个位置添加,而是在第1个位置添加,并将前3个项目向下移动1

这可能是什么原因造成的

主要活动

package com.app.bowling.animalsrecycler;


import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;

import static java.sql.Types.NULL;

public class MainActivity extends Activity implements RemoveClickListner{
    private RecyclerView mRecyclerView;
    private RecyclerAdapter mRecyclerAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    Button btnAddItem;
    ArrayList<RecyclerData> myList = new ArrayList<>();
     EditText etTitle;
    String title = "";
    ImageView crossImage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerAdapter = new RecyclerAdapter(myList,this);


        mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
        mRecyclerView.setAdapter(mRecyclerAdapter);

         etTitle = (EditText) findViewById(R.id.etTitle);


        if (mRecyclerAdapter.getItemCount() == 0 || mRecyclerAdapter.getItemCount() == NULL){
            Toast.makeText(getApplicationContext(),"ZERO ITEMS LISTED",Toast.LENGTH_SHORT).show();
        }

        btnAddItem = (Button) findViewById(R.id.btnAddItem);
        btnAddItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                title = etTitle.getText().toString();

 //               if (title.matches("")) {
 //                   Toast.makeText(v.getContext(), "You did not enter a Title", Toast.LENGTH_SHORT).show();
 //                   return;
 //               }


                RecyclerData mLog = new RecyclerData();
//                mLog.setTitle(title);

                myList.add(mLog);
                mRecyclerAdapter.notifyData(myList);
                etTitle.setText("");


                if (mRecyclerAdapter.getItemCount() > 0) {
                    Toast.makeText(v.getContext(), mRecyclerAdapter.getItemCount() + " Items Displayed", Toast.LENGTH_SHORT).show();
                    return;
                }

            }
        });
    }
    @Override
    public void OnRemoveClick(int index) {
        myList.remove(index);
        mRecyclerAdapter.notifyData(myList);
    }
}
移除Clicksner

package com.app.bowling.animalsrecycler;

public interface RemoveClickListner {
    void OnRemoveClick(int index);
}

Activity_Main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:padding="16dp"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Title"
        android:id="@+id/etTitle" />

    <Button
        android:id="@+id/btnAddItem"
        android:text="Add Item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#dbfffe" />
</LinearLayout>
package com.app.bowling.animalsrecycler;
公共接口RemoveClickListner{
void OnRemoveClick(int索引);
}
主要活动
回收视图项目

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_margin="8dp"
    android:id="@+id/cardview"
    android:layout_height="112dp">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/mainLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <EditText
            android:id="@+id/txtTitle"
            android:maxLines="1"
            android:inputType="text"
            android:maxLength="15"
            android:layout_width="273dp"
            android:layout_height="56dp"
            android:layout_marginEnd="122dp"
            android:layout_marginBottom="56dp"
            android:padding="12dp"
            android:textColor="@android:color/black"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_conversion_absoluteHeight="0dp"
            tools:layout_conversion_absoluteWidth="0dp"
            tools:layout_conversion_wrapHeight="0"
            tools:layout_conversion_wrapWidth="0" />


        <ImageView
            android:id="@+id/crossImage"
            android:layout_width="136dp"
            android:layout_height="112dp"
            android:layout_marginStart="273dp"
            android:background="@drawable/ic_add_circle_black_24dp"
            android:paddingLeft="10dp"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_conversion_absoluteHeight="0dp"
            tools:layout_conversion_absoluteWidth="0dp"
            tools:layout_conversion_wrapHeight="0"
            tools:layout_conversion_wrapWidth="0" />
    </android.support.constraint.ConstraintLayout>
</LinearLayout>

请尝试替换下面的代码片段

myList.add(mLog);
mRecyclerAdapter.notifyData(myList);
etTitle.setText("");
添加以下内容:

myList.add(mLog);
mRecyclerAdapter.addAll(myList);
mRecyclerAdapter.notifyDataSetChanged();
etTitle.setText("");

我想看看你的布局活动_main和recycler _view项,因为我已经尝试实现了你的代码,代码运行良好,请检查下面的代码

请找到下面的屏幕截图


请告诉我这是否是您的预期应用程序

将您的代码张贴在此处或您所做的一切。如果您将代码片段粘贴在此处,我将不胜感激。只需一个注释。我在ADD ITEM按钮的左侧添加了一个editview。就像占位符一样。当我单击ADD ITEM时,将焦点放在recyclerview中的EDITVIEW上并添加文本。如果我点击“添加”按钮,当我第四次添加时,它会将其置于0位置。如果我重复同样的操作,但单击EDITVIEW,然后添加项目,它工作得非常好,并将所有内容按正确的顺序排列,从最旧到最新。不理解差异及其原因,因为我不会在“添加项目”按钮旁边使用EDITVIEW。请尝试在列表中添加值后调用mAdapter.notifyItemInserted(position)。将whcih代码段替换为what?这与我要查找的内容类似。但是没有editview,只有一个ADD按钮。单击ADD按钮时,它会在recyclerview中创建一个EDITVIEW,并获得焦点,以便您可以输入所需的文本。我发现问题只是不确定如何纠正。当您第四次这样做时,它会在recyclerview中创建一个EDITVIEW,就像它应该创建的一样,但位于位置0,而不是位置3。所以我尝试并添加了一个EDITVIEW,就像你的例子一样。当您执行相同的操作时,只要“添加”按钮旁边的EDITVIEW具有焦点,它就会在位置3创建EDITVIEW。没有.addAll这样的东西。当我这样做的时候,它希望我为它创建一个方法。这是一个解决方案,但不确定如果不这样做如何实现它,请在recyclerview外部的ADDBUTTON旁边创建一个EDITVIEW。使其不可见,当您单击“添加”按钮时,在recyclerview中失去对EDITVIEW的关注,并将其交给不可见的EDITVIEW,然后在recylerview中创建新的EDITVIEW。能否将焦点设置为visible设置为no的项目?或者,解决方案可能是在recylerview中单击ADD BUTTON count元素并手动设置新创建的EDITVIEW的位置。requestFocus();这是recylerview之外的EDITVIEW。这个解决方案的问题是,在我的最后一段代码中,我不会让EDITVIEW出现在回收器之外,只有add按钮。UPDATE:我从头开始。我通过每一步构建一个apk来找出实际问题所在。问题的一部分是理解将textwatcher放在回收视图的何处。使用上面的旧代码,它不会进入RecyclerItemViewHolder下的RECYCLERADAPTER。那么我把TextWatcher放在哪里呢?更新:把TextWatcher放在标题栏中。在创建和textwatcher中设置EDITTEXT时,我使用以下命令:holder.etTitleTextView.setText(myList.get(position.getTitle());一切都很好。我删除了onfocus,现在当您添加一个项目时,它会转到列表中的第一个项目。如果我把requestfocus重新打开,它将转到新添加的编辑文本。问题是,当你添加一个新项目时,它会转到下一行,焦点会转到列表中的第一个项目,而不是列表中的最新项目。
myList.add(mLog);
mRecyclerAdapter.notifyData(myList);
etTitle.setText("");
myList.add(mLog);
mRecyclerAdapter.addAll(myList);
mRecyclerAdapter.notifyDataSetChanged();
etTitle.setText("");