Android 在选定的RecyclerView行中更新TextView

Android 在选定的RecyclerView行中更新TextView,android,android-fragments,android-recyclerview,android-adapter,Android,Android Fragments,Android Recyclerview,Android Adapter,我在片段中有一个RecyclerView,其中每一行都有一个适配器,用于为布局充气,如下所示: 我想访问每行的EditText(在下面的代码numberET中)的值,如果EditText不为空,则选择该值。 如何在RecyclerView的每个元素上循环(我认为是在适配器内部)以实现此行为?如何访问每个元素的EditText以检索值并在片段中使用它们? 适配器: ` 您必须将该数据保留在一些基于地图的数据结构中,然后,每当需要这些值时,就迭代该数据结构 您不能依赖于将该数据保存在ViewHold

我在片段中有一个
RecyclerView
,其中每一行都有一个适配器,用于为布局充气,如下所示:


我想访问每行的
EditText
(在下面的代码
numberET
中)的值,如果
EditText
不为空,则选择该值。
如何在RecyclerView的每个元素上循环(我认为是在适配器内部)以实现此行为?如何访问每个元素的EditText以检索值并在片段中使用它们?

适配器: `


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

您不能依赖于将该数据保存在
ViewHolder
中,因为执行滚动时,
ViewHolder
将被重新使用。如果您当前未保存在
EditText
中填写的数据,则如果您有许多项并执行滚动,您将丢失该数据(即屏幕适合10项,但适配器有20项,一旦您滚动到第15项,第一项的
EditText
值将丢失)


非常感谢。因此,如果从
RecyclerView
检索支架,由于
RecyclerView
中有大量物品,我也会遇到同样的问题。我无法理解您的意思。你能解释一下吗?我的意思是,我从
RecyclerView
中通过
RecyclerView.findViewHolderForLayoutPosition(position)
获得在给定位置关联的持有者。如果我在
RecyclerView
中包含的
ViewHolder
上循环,并且
RecyclerView
有20个项目,而我的
片段一次只能显示4个项目,我将丢失未显示的
EditText
的内容。我说得对吗?谢谢你的解释!
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);
    }
    }
}`
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);
    }
}
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) {
        }
    });
}
@Override
public void onViewRecycled(MyViewHolder holder) {
    holder.editText.clearTextChangeListeners();
    super.onViewRecycled(holder);
}