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("");