2016-08-06 77 views
1

Ich versuche dynamisch Textview zu implementieren, in meiner Ansicht Halter, auf der ersten Bildlauf alles geht gut, die Karten und so sind die Eigenschaften für jeden, aber wenn ich zurück scrollen wieder fängt die Textansicht an zu knallen, wo sie nicht sollte.Hinzufügen von dynamischen Textansichten zu RecyclerView ViewHolder verwirren die Ansichten

meinen benutzerdefinierten Adapter:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { 

public interface OnItemClickListener { 
    void onItemClick(MyProduct product); 
} 

int counter = 0; 
private OnItemClickListener listener; 
private Context context; 
List<MyProduct> myProducts; 


public CustomAdapter(OnItemClickListener listener, List<MyProduct> myProducts, Context context) 
{ 
    super(); 
    this.listener = listener; 
    this.myProducts = myProducts; 
    this.context = context; 
} 

@Override 
public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.product_list, parent, false); 
    ViewHolder viewHolder = new ViewHolder(v); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) { 

    if(myProducts != null) { 

     holder.bind(myProducts.get(position), listener); 
     counter++; 
    } 
} 

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


public class ViewHolder extends RecyclerView.ViewHolder { 
    //Views 
    public ImageView imageView; 
    public TextView textViewProductTitle; 
    public TextView textViewProductDescription; 
    public TextView textViewProductSerialNumber; 
    public TextView textViewProductPrice; 
    List<TextView> textViews; 
    ViewGroup viewGroup; 


    //Initializing Views 
    public ViewHolder(View itemView) { 
     super(itemView); 


     viewGroup = (ViewGroup)itemView.findViewById(R.id.linearCatalog); 
     textViews = new LinkedList<>(); 
     imageView = (ImageView) itemView.findViewById(R.id.thumbnail); 
     textViewProductTitle = (TextView) itemView.findViewById(R.id.textViewProductTitle); 
     textViewProductDescription = (TextView) itemView.findViewById(R.id.textViewProductDescription); 
     textViewProductSerialNumber = (TextView) itemView.findViewById(R.id.textViewProductSerialNumber); 
     textViewProductPrice = (TextView) itemView.findViewById(R.id.textViewProductPrice); 

    } 

    public void bind(final MyProduct item, final OnItemClickListener listener) { 



     Glide.with(context).load(item.getProductImage()) 
     /*.asBitmap().format(DecodeFormat.PREFER_ARGB_8888).*/ 
     .crossFade() 
     .diskCacheStrategy(DiskCacheStrategy.ALL) 
     .into(imageView); 
     textViewProductTitle.setText(item.getProductTitle()); 
     textViewProductDescription.setText(item.getProductDescription()); 
     textViewProductSerialNumber.setText(item.getProductSn()); 
     textViewProductPrice.setText(item.getProductPrice()); 

     if(counter< myProducts.size()) 
     { 
      for (int i = 0; i < item.getBranchCounter(); i++) { 
       TextView textView = new TextView(context); 
       textView.setText(item.getAddressList().get(i)); 
       textViews.add(textView); 
       viewGroup.addView(textView); 
      } 
     } 

     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       listener.onItemClick(item); 
      } 
     }); 
    } 
} 

irgendwelche Ratschläge wäre hilfreich, ty!

Antwort

3

Das dynamische Hinzufügen von Ansichten in eine Recycler-Ansicht ist eine schlechte Idee. Der Punkt einer Recycleransicht ist, dass dieselbe Ansichtsstruktur über mehrere Elemente hinweg recycelt wird. Wenn sie recycelt wird, haben Sie diese Ansicht plötzlich einem neuen Element hinzugefügt, das sie nicht benötigt. Dynamische Ansichten sind fast keine Voraussetzung für eine Recycler-Ansicht.

Ein besserer Weg ist es, mit Sichtbarkeiten zu spielen. Platzieren Sie die Textansicht in allen Ansichten, aber deaktivieren Sie sie. In Ihrer Bindung würden Sie dann die Sichtbarkeit der Textansicht für jedes Element festlegen - entweder auf GONE oder VISIBLE. Dadurch erhalten Sie den gewünschten Effekt.

Eine andere Möglichkeit wäre die Verwendung verschiedener Ansichtstypen für mit und ohne die zusätzliche Ansicht, aber das ist tendenziell komplizierter.

+0

Ok ich sah den Trick mit GONE und VISIBLE, aber das sind, wenn Sie wissen, wieviele textview Sie benötigen, ich brauche von 1-5 hängt das Element. Schalter() ? – 2Stoned

+1

Dann wirst du Schmerzen haben. Aber ich würde immer noch nicht empfehlen, die Textansichten dynamisch hinzuzufügen - Sie spielen besser mit den Sichtbarkeiten aller 5 oder mit verschiedenen Ansichtsarten. Die Alternative wäre das dynamische Entfernen und Hinzufügen von Bindungen, was einige der Vorteile der Recycler-Ansicht kosten würde und ein Ärger für den Code wäre. –

+0

Ok Herr, Schalter() von 1-5 :) TY !!! – 2Stoned

0

Ich stimme @Gabe Sechan völlig zu. Aber auch wenn Sie textView dynamisch hinzufügen möchten. Dann können Sie eine ganze Zahl an der Spitze der Adapter Klasse deklarieren wie

int repeat=0; 

Jetzt Variable verwenden, um jede Textviews zählen Sie hinzugefügt haben. Überprüfen Sie auch, ob es die Größe Ihres Arrays überschreitet.

Dadurch wird die Duplizierung der Textansicht begrenzt.