2017-10-20 27 views
0

Dans mon projet, editext champs (RARnom avec prix) dans chaque élément de recyclerview, quand je click sur Enregistrer besoin d'obtenir toutes les valeurs de champ dans une liste de string, aussi quand J'ai entré des valeurs après que les valeurs de défilement ont été échangées. Voici mon code.Comment obtenir des valeurs de EditExt de recyclerview dans une liste de chaînes

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); 
     } 
    } 
    } 
} 

Voici la méthode pour obtenir la liste des chaînes à partir des valeurs 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; 
} 

Voici l'erreur que j'ai.

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

'également lorsque j'ai entré des valeurs après le défilement des valeurs de défilement. '. Vous devriez d'abord résoudre cette 'fonctionnalité'. Cela n'a aucun sens de s'attaquer à d'autres problèmes en premier. – greenapps

+0

Un 'RecyclerView' supprime réellement' Views' quand ils ne sont plus visibles, donc, il n'est pas possible de récupérer des valeurs edittext à partir de lignes invisibles. Sauf si vous mettez en cache ces valeurs dans votre application. –

+0

'view.findViewById (R.id.edtPrice);'. Vous avez découvert que votre NullPointerException provient de cette déclaration? Eh bien c'est le cas. Donc voir == null. Vérifiez avant utilisation. Vous ne pouvez plus obtenir le texte d'éditions appartenant à des vues qui ne sont plus visibles. – greenapps

Répondre

0

Votre implémentation actuelle ne fonctionnera pas comme prévu. Si vous entrez du texte dans n'importe quel EditText et que vous commencez à faire défiler suffisamment le système va recycler les Vues qui ont été défilées hors de l'écran et vous commencerez à voir apparaître du texte répété qui a déjà défilé à l'écran. Correction: vous devez créer une ArrayList ou un tableau de chaînes. À l'intérieur de MyViewHolder, vous devez implémenter un écouteur de modification de texte et chaque fois que le texte de EditText change, vous ajoutez cette valeur de texte dans ArrayList pour la position logique du ViewHolder donné en utilisant la méthode getAdapterPosition(). La méthode getAdapterPositio est une méthode sur la classe ViewHolder que toutes les sous-classes par défaut héritent. Utilisez la valeur de cette méthode en tant qu'index dans votre ArrayList/tableau, puis stockez la valeur de texte que vous extrayez de l'écouteur de modification de texte. À l'intérieur de la méthode onBindViewHolder() de votre adaptateur, vous devriez vérifier ArrayList/array avec l'argument position pour vérifier si une chaîne est présente, si on l'a définie sur EditText sinon si null définir manuellement le texte à une chaîne vide. Cela s'assurera que vous ne voyez pas vos valeurs de texte incorrectement recyclées pendant le défilement.

+0

Si cinq vues sont visibles, alors la position de quelle vue sera fournie par getAdapterPosition()? Celui qui est édité à ce moment-là? Je ne peux pas imaginer ça. – greenapps

+0

Oui, c'est exactement ce qui va arriver. Mais vous devez affecter l'écouteur de modification de texte sur chaque EditText de MyViewHolder. –

+0

Je ne le crois pas. En supposant que getAdapterPosition() n'a pas de paramètres. – greenapps