gpt4 book ai didi

android - 更新选定 RecyclerView 行中的 TextView

转载 作者:行者123 更新时间:2023-11-30 00:35:03 26 4
gpt4 key购买 nike

我在一个 fragment 中有一个 RecyclerView,其中每一行都有一个适配器,它会扩展如下所示的布局:enter image description here


我想访问每一行的 EditText 的值(在下面的代码 numberET 中),如果 EditText 不为空。
我如何循环 RecyclerView 的每个元素(我认为在适配器内部)以产生这种行为?如何访问每个元素的 EditText 以检索值并在 fragment 中使用它们?

适配器:`

public class UserFBEditTextAdapter <T extends UserFBEditTextAdapter.ViewHolder> extends UserFBAdapter<UserFBEditTextAdapter.ViewHolder>{
public UserFBEditTextAdapter(List<UserFB> users,int layoutId, Context context) {
super(users, layoutId, context);
}

@Override
public UserFBEditTextAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
return new UserFBEditTextAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(UserFBAdapter.ViewHolder holder, int position) {
holder.userFB = users.get(position);
holder.usernameTV.setText(holder.userFB.getName());
}

public class ViewHolder extends UserFBAdapter.ViewHolder {
protected EditText numberET;

public ViewHolder(View itemView) {
super(itemView);
numberET = (EditText) itemView.findViewById(R.id.number_et);
}
}
}`

fragment :

public class ExpenseCustomFragment extends Fragment {

private OnFragmentInteractionListener mListener;
private UserFBAdapter adapter;
private RecyclerView userCustomList;

public ExpenseCustomFragment() {
// Required empty public constructor
}

public static ExpenseCustomFragment newInstance() {
ExpenseCustomFragment fragment = new ExpenseCustomFragment();

return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_expense_custom, container, false);

userCustomList = (RecyclerView) view.findViewById(R.id.amountlist_rv);
userCustomList.setLayoutManager(new LinearLayoutManager(getContext()));

NewExpenseDescriptionActivity activity = (NewExpenseDescriptionActivity) getActivity();
adapter = new UserFBEditTextAdapter(activity.getUsersGroup(), R.layout.listitem_expensecustom, getContext());

userCustomList.setAdapter(adapter);


return view;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}

最佳答案

您必须将该数据保留在一些基于 map 的数据结构中,然后,每当需要这些值时,迭代该数据结构。

您不能依赖于将数据保存在 ViewHolder 中,因为一旦您执行滚动,ViewHolder 就会被重用。如果您当前不保存 EditText 中填充的数据,那么如果您有很多项目并执行滚动(即屏幕适合 10 个项目,但您的适配器是 20 个项目,您将丢失该数据,一旦滚动到第 15 个项目,第一个项目的 EditText 值就会丢失。

private Map<Integer, String> map = new ArrayMap<>(adapterSize);

...

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
String text = map.get(holder.getAdapterPosition());
// maybe we haven't yet saved text for this position
holder.editText.setText(text != null ? text : "");
// updated value in map as soon as the `EditText` in this position changes
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
map.put(holder.getAdapterPosition(), s.toString());
}

@Override
public void afterTextChanged(Editable s) {
}
});
}

现在您可以访问 RecyclerView 中的所有 EditText 值。您可以考虑的唯一更改是在用户停止输入后更新 map 。目前,如果用户输入“123456789”, map 将更新 9 次,而我们只需要一次。一个简单的解决方案是结合使用 RxJavadebounce operatorRxBinding 库。这听起来可能很复杂,但您可以看到它是多么简单 in this answer

这会起作用。但是在你执行上下滚动之后,很快你就会发现那里有些乱七八糟的。这是因为每次调用 onBindViewHolder() 时,都会将一个新的 TextWatcher 添加到已有 TextWatcherEditText > 附在上面。因此,在回收 ViewHolder 之后,您还必须注意移除 TextWatcher

但是没有一个 API 可以删除 EditText 的所有 TextWatcher。您可以使用 this answer 中显示的自定义 EditText 实现,它将清除所有附加到此 EditTextTextWatcher:

@Override
public void onViewRecycled(MyViewHolder holder) {
holder.editText.clearTextChangeListeners();
super.onViewRecycled(holder);
}

关于android - 更新选定 RecyclerView 行中的 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43572002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com