Android 如何使recyclerview加载所有项目视图

Android 如何使recyclerview加载所有项目视图,android,android-recyclerview,kotlin,Android,Android Recyclerview,Kotlin,我有一个recyclerview,可以加载多达30个ItemView和更多 在每个itemview中,它都有一个Edittext,允许用户输入一些数据 还有一个保存按钮。 在“保存”按钮内单击一次 for (i in 0 until count){ //count = myRecycler.layoutmanager.itemcount val view = myRecycler.layoutmanager!!..findViewByPosition(i) val input: EditText

我有一个recyclerview,可以加载多达30个ItemView和更多 在每个itemview中,它都有一个Edittext,允许用户输入一些数据 还有一个保存按钮。 在“保存”按钮内单击一次

for (i in 0 until count){ //count = myRecycler.layoutmanager.itemcount
val view = myRecycler.layoutmanager!!..findViewByPosition(i)
val input: EditText = view!!.findViewById(R.id.input)
list.add(input.text.toString())
} 
它按位置适用于每个itemview 但是,因为recyclerview只加载适合屏幕的项目,所以对于屏幕外的项目,它在视图val处提供空指针 有什么解决办法可以做到这一点吗 我得到的解决方案 是在每个itemview上添加一个save按钮,以便用户在输入数据时单击save按钮,依此类推。
但这不是我需要的

我建议您通过setOnFocusChangeListener对每个editText的失去焦点进行回调,以更新活动或片段中的数据列表。RecyclerView.Adapter中的代码

interface Calllback{
    function updateValue(int position, String value)
}

@Override
public void onBindViewHolder(myViewHolder holder, int position) {

    ...
    holder.editText.setOnFocusChangeListener(new OnFocusChangeListener() {          
        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus) {
                callback.updateValue(holder.getAdapterPosition(), ((EditText)v).getText().toString());
            }
        }
    });
    ...
}
在实现回调接口的活动中

class MainActivity extends AppCompatActivity implements Callback{

    private String data = new String[30];

    ...

    @Override
    function updateValue(int position, String value){
        data[position] = value;
    }

    ... 
}

在每个EditText上使用TextWatcher,并在其文本发生更改时获取回调,并按如下方式保存文本:

editText.addTextChangedListener(object : TextWatcher
        {
            override fun afterTextChanged(s: Editable?) {
               //Save your string here

            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }

        })
但那不是我需要的,不管你需要与否都无关紧要
这就是
回收视图的工作原理
在一个项目的
EditText
中输入的值必须保存在适配器中,然后必须调用
notifyItemChanged()
,否则在滚动后它将丢失
这适用于您在
RecyclerView
项目中所做的每项更改

如果保存适配器中的所有更改,则可以循环使用适配器项,而不是直接通过
RecyclerView
项,这不会导致任何错误。

IMO,请小心addTextChangedListener,不要在onBindViewHolder函数中多次添加它,否则会导致此事件多次触发。您只需要在ViewHolder构造函数中添加TextChangedListener,并且当您收到回调时,可以使用getAdapterPosition()用于获取我们得到回调的项的位置。您的方法导致我多次输入数据。例如,我输入了30个数据,但存储的数据可能达到60或90。您能否告诉我如何通过编程实现这一点?为什么使用
holder.getPosition()
,而
int position
参数是否相同,因为
holder.getPosition()
在片段中使用回调时被弃用,所以在RecyclerAdapteroops中回调时会出现kotlin.KotlinNullPointerException,这是我的错误。它应该是getAdapterPosition(),之所以在位置上使用它,是因为如果数据已更改,适配器可能不会更新。这里有更多信息。如果您使用片段,您需要将回调实例(片段本身)传递给适配器,如下所示