2017-10-20 4 views
0

私のプロジェクトでは、recyclerviewの私のプロジェクトeditextフィールド(価格のcarname)で、clickを保存するとすべてのフィールド値をstringのリストに入れる必要があるときにもスクロールした値を入れ替えた後に値を入力しました。ここに私のコードです。recyclerviewのeditext値を文字列のリスト

private class PricesAdapter extends RecyclerView.Adapter<PricesAdapter.MyViewHolder> { 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_cars_type_item, parent, false); 
    return new MyViewHolder(layoutView); 
    } 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    holder.tvCarType.setText(carsList.get(position)); 
    holder.edtPrice.setText(""); 
    holder.edtPrice.setTag(position); 
    } 

@Override 
    public int getItemCount() { 
    return carsList.size(); 
    } 

@Override 
    public int getItemViewType(int position) { 
    return super.getItemViewType(position); 
    } 

public class MyViewHolder extends RecyclerView.ViewHolder { 

    TextView tvCarType; 
    EditText edtPrice; 

    public MyViewHolder(View itemView) { 
    super(itemView); 
    tvCarType=(TextView)itemView.findViewById(R.id.tvCarType); 
    edtPrice=(EditText)itemView.findViewById(R.id.edtPrice); 
     } 
    } 
    } 
} 

editext値から文字列のリストを取得する方法です。

public List<string> getPriceValues(){ 
    List<String> priceList = new ArrayList<>(); 

    for (int i = 0; i < carsList.size(); i++) { 

    View viewHolder=rvPrices.getRootView(); 

    View view1=mLayoutManager.findViewByPosition(i); 
    View view=rvPrices.getChildAt(i); 
    View root=rvPrices.getRootView(); 
    //   PricesAdapter.MyViewHolder myViewHolder=(PricesAdapter.MyViewHolder)rvPrices.findViewHolderForLayoutPosition(i); 
      //   String price=myViewHolder.edtPrice.getText().toString().trim(); 
    EditText edtPrice=(EditText) view.findViewById(R.id.edtPrice); 
    String price = edtPrice.getText().toString().trim(); 
    priceList.add(price); 
    }      
    return priceList; 
} 

ここにはエラーがあります。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
+1

'スクロール後に値を入力したときも値が入れ替えられます。 '。最初にその '機能'を解決する必要があります。最初に他の問題に取り組むのは意味がありません。 – greenapps

+0

'RecyclerView'は実際には表示されていないときに' Views'を削除します。したがって、目に見えない行からedittext値を取得することはできません。これらの値をアプリケーションにキャッシュしない限り。 –

+0

'view.findViewById(R.id.edtPrice);'。あなたはNullPointerExceptionがこの文から来ていることを発見しましたか?そうです。したがって、view == null。使用前に確認してください。あなたはもはや見ることができないビューに属するedittextsからテキストを得ることができません。 – greenapps

答えて

0

あなたの現在の実装は期待どおりに機能しません。任意のEditTextにテキストを入力して十分にスクロールし始めると、システムはオフスクリーンでスクロールされたビューをリサイクルし、以前に画面をスクロールして表示されたテキストの繰り返しを開始します。 修正:ArrayListまたはStringの配列を作成する必要があります。 MyViewHolderの内部では、テキスト変更リスナーを実装し、EditTextのテキストが変更されるたびに、getAdapterPosition()メソッドを使用して、指定されたViewHolderの論理位置のArrayListにそのテキスト値を追加します。 getAdapterPositioメソッドは、すべてのサブクラスがデフォルト継承するViewHolderクラスのメソッドです。そのメソッドの値をArrayList /配列のインデックスとして使用し、テキスト変更リスナーから取得したテキスト値を格納します。アダプタのonBindViewHolder()メソッドの内部では、ArrayList /配列をposition引数でチェックして文字列が存在するかどうかを確認し、EditTextでそれが設定されている場合はnullを、nullを手動で空の文字列に設定します。これにより、スクロール中にテキスト値が間違ってリサイクルされるのを防ぐことができます。

+0

5つのビューが表示されている場合、どのビューの位置がgetAdapterPosition()によって配信されるのでしょうか?その瞬間に編集されたもの?それを想像することはできません。 – greenapps

+0

はい、それはまさに何が起こるかです。しかし、すべてのMyViewHolderのEditTextにテキスト変更リスナーを割り当てる必要があります。 –

+0

私はそれを信じていません。 getAdapterPosition()にパラメータがないと仮定します。 – greenapps

関連する問題