我有一个Activity
,其中有一个RecyclerView
,然后保存Button
。 RecyclerView
的每个项目(足球比赛)都包含一些文本(球队名称)和EditText
,用户在此处输入数据(实际上是在比赛中下注)。我的目标是当用户单击保存Activity
时将这些乐谱保存到Button
中的列表中。
[我在Activity
中实现了此方法,实际上是从LinearLayoutManager
中获取特定项,然后从EditText
中获取数据,但是findViewByPosition()
方法(或getChildAt()有不同的方法可以执行此操作)有时会返回空。
我在类似问题上看到了另一个答案,但它们并没有帮助我。也许我的策略是错误的,因为我在Activity中制定了完整的逻辑(最好在Adapter中执行此操作?),并且即使只有一个用户输入了分数,我仍然可以理解RecyclerView
中的所有项目。
private List<Bet> getUserBets() {
View betView;
Bet betItem;
EditText userBet1;
EditText userBet2;
int numberOfMatches = rvBetsAdapter.getItemCount();
List<Bet> bets = new ArrayList<>();
for (int i = 0; i < numberOfMatches; i++)
{
betItem = rvBetsAdapter.getItem(i);
betView = linearLayoutManager.findViewByPosition(i);
userScore1 = (EditText) betView.findViewById(R.id.result1); // <- NPE appears
userScore2 = (EditText) betView.findViewById(R.id.result2);
//here i checked whether the editText is empty and other stuff
bets.add(betItem);
}
return bets;
}
我该如何解决?我想我应该在适配器的onBindViewHolder方法中做些什么,但是究竟是什么呢?我将非常感谢您的帮助。
您应该添加到Bet
模型变量中,该变量包含EditText
值,例如editTextValue
。
并使用适配器列表中的列表来访问它,像这样最终从那里使用EditText
值。 rvBetsAdapter.getItem(i).editTextValue
[editTextValue
可以使用TextWatcher.afterTextChanged()
回调设置
您只能找到或获取屏幕上可见的视图。
使用findViewByPosition(2)
之前通过recyclerView.scrollToPosition(2);
转到位置2
如果您想更改此视图的值,最好的方法是将您的商品放入列表中
yourModel item = (yourModel) itemList.Get(2)
item.Name = "Edited";
yourAdapter.notifyItemChanged(2);