Android 如何使recyclerview加载所有项目视图
我有一个recyclerview,可以加载多达30个ItemView和更多 在每个itemview中,它都有一个Edittext,允许用户输入一些数据 还有一个保存按钮。 在“保存”按钮内单击一次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
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(),之所以在位置上使用它,是因为如果数据已更改,适配器可能不会更新。这里有更多信息。如果您使用片段,您需要将回调实例(片段本身)传递给适配器,如下所示