1

私はそれぞれの行は次のように見えるレイアウトを膨張させるアダプタを持っているフラグメント内部RecyclerView持っている:私はEditText(内の値にアクセスしたいenter image description here更新のTextView


を次のコードnumberET)を入力し、EditTextが空でない場合は値を選択します。
RecyclerViewの各要素(このアダプタの中にあると思います)をこの動作にするにはどうすればいいですか?どのように各要素の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); 
    } 
} 

答えて

1

あなたは、いくつかのマップベースのデータ構造にそのデータを保持する必要があり、それらの値が必要な時はいつでも、その後、反復処理そのデータ構造。

スクロールするとすぐにViewHolderが再利用されているため、そのデータをViewHolderに保存することはできません。現在EditTextに記入されたデータを保存しないと、多くのアイテムがあり、スクロールを実行するとデータが失われます(つまり、10個のアイテムに適合する画面ですが、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の値にアクセスすることができます。考慮できる唯一の変更は、ユーザーが入力をやめた後にマップを更新することです。現在、ユーザータイプが「123456789」の場合、マップは9回更新されますが、1回のみ必要です。これに対する簡単な解決策は、RxBindingライブラリと組み合わせたのRxJavaのを使用することができます。これはおそらく複雑に聞こえるかもしれませんが、あなたはどれほど平凡であるかは、in this answerです。

これは動作します。しかし、あなたが前後にスクロールするとすぐに、いくつかの混乱がそこに起こっていることがわかります。これは、onBindViewHolder()が呼び出される度に、TextWatcherが既に添付されているEditTextに新たにTextWatcherが追加されるためです。したがって、ViewHolderをリサイクルした後にTextWatcherを取り除く必要があります。

EditTextTextWatcherをすべて削除するAPIはありません。あなたはこのEditTextに接続されているすべてのTextWatcherをクリアしますthis answerに示すカスタムEditText実装を使用することができます。

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

ありがとうございました!だから、 'RecyclerView'から所有者を取得した場合、私は' RecyclerView'のアイテムの数が多いため、同じ問題が発生します。 –

+0

あなたは何を意味するのか理解できませんでした。それを言い換えることはできますか? – azizbekian

+0

私は、 'recyclerView.findViewHolderForLayoutPosition(position)'を通して与えられた位置に関連付けられたホルダーを 'RecyclerView'から取得します。 'RecyclerView'に含まれる' ViewHolder'と 'RecyclerView'に含まれる' RecyclerView'には例えば20項目ありますが、私の 'Fragment'は一度に4項目しか表示できませんが、' EditText'の内容は失われます。表示されません。私はそれを正しく持っていますか? –

関連する問題