2013-12-21 9 views
5

Ich habe einen benutzerdefinierten Basisadapter, der eine Daten-Arraylist aufnimmt. Von hier aus wird eine Rasteransicht mit benutzerdefinierten Schaltflächen ausgefüllt. Es macht es perfekt und füllt die Gridview. Das Problem ist. Ich möchte eine Schaltfläche zum Ändern der Farben bei Änderung festlegen. Wenn Sie dies tun, wird die nächste Ansicht, die recycelt wird, geändert, da die Ansicht wiederverwendet wird. Ex. Klicken Sie auf Knopf eins an Position 0. Auch Knopf an Position 13 geändert. Jetzt, wenn ich etwas Debugging, finde ich, dass es auch einige der Eigenschaften ändert. Ich frage mich, ob es überhaupt möglich ist, meine Ansicht so zu erstellen, wie ich es sehe, ohne einen Teil der Ansichten recyceln zu müssen.Verhindern Sie, dass der Adapter Ansichten auf Bildlauf verwertet (Bearbeiten Sie das nie.)

Ich habe einige Dinge über die Verwendung von stableIDs gesehen, aber selbst wenn ich es auf True übersteuert habe. Es ändert es derzeit noch nicht.

static class CategoryButtonAdapter extends BaseAdapter 
{ 
    private Context mContext; 
    private ArrayList<DishCategory> dishCategories; 
    private ArrayList<Dish> dishItems; 
    static ArrayList<DishCategoryButton> mDishCategoryButtons; 
    //will take in an array list created in the orderlayout that will be the 
    //dish category. This will be the from where we will the count for the adapter 
    public CategoryButtonAdapter(Context context, ArrayList<DishCategory> dishCategories) 
    { 
     this.mContext = context; 
     this.dishCategories = dishCategories; 

     dishItems = dishCategories.get(0).getDishes(); 
    } 

    public int getCount() 
    { 
     return dishCategories.size(); 
    } 

    //to be implementated later so it can b3e used to find menu categories 
    @Override 
    public DishCategory getItem(int position) 
    { 
     return dishCategories.get(position); 
    } 

    public void getDishCategoryButtons() 
    { 
     if(mDishCategoryButtons.size() == 0) 
     { 
      System.out.println("The number of buttons in this adapapter is " + mDishCategoryButtons.size()); 
     } 
     else 
     { 
      System.out.println("The number of buttons in this adapapter is " + mDishCategoryButtons.size()); 
     } 
    } 

    public long getItemId(int position) 
    { 
     return dishCategories.get(position).getDishCategoryID(); 
    } 

    @Override 
    public boolean hasStableIds() { 
     //return super.hasStableIds(); //To change body of generated methods, choose Tools | Templates. 
     return true; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder; 
     DishCategoryButton button = null; 
     //button to be created 
     if(convertView == null) 
     { 
      holder = new ViewHolder(); 
      //if it is not recycled, initialize some new attributes 
      button = new DishCategoryButton(this.mContext,dishCategories.get(position)); 
      button.setLayoutParams(new GridView.LayoutParams(100,100)); 
      button.setPadding(2,2,2,2); 
      //convertView.setTag(holder); 
      button.setTag(holder); 
     } 
     else 
     { 
      //holder = (ViewHolder)convertView.getTag(); 
      button = (DishCategoryButton) convertView; 
     } 
     //setButton to the description of the category 
     //mDishCategoryButtons.add(button); 
     button.setText((dishCategories.get(position).getDescription())); 
     //this can be changed later to change the sex appeal of the app 
     //for now it will be plain 
     button.setId(position); 

     //.setOnClickListener(new View.OnClickListener() 
     button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
      DishCategoryButton dishCategoryButton = (DishCategoryButton)v; 
      PaintDrawable drawable = (PaintDrawable) dishCategoryButton.getBackground(); 
      System.out.println("Dish button position is " + dishCategoryButton.getId()); 
      //System.out.println("The position from the array says it is at " + position); 
      System.out.println("Dish Category is " + dishCategoryButton.getDishCategory().getDescription()); 
      System.out.println("Is it currently selected " + dishCategoryButton.getIsSelected()); 

      int color = drawable.getPaint().getColor(); 
        System.out.println("Color is " + color); 
        dishCategoryButton.setIsSelected(true); 
        drawable = (PaintDrawable) dishCategoryButton.getBackground(); 
        color = drawable.getPaint().getColor(); 
        System.out.println("Color is " + color); 
         System.out.println("hi"); 

        // The toggle is enabled 

      } 
     }); 
     //new loadDishItems(categoryButtons.get(position).getDescription())); 
     return button; 
    } 

Machen Sie sich keine Sorgen um den Ansichtshalter. Das war ein Versuch, das Recycling zu verhindern. Irgendwelche Hinweise oder Ideen, wie man das bekommt?

Hier ist meine Schaltfläche

public class DishCategoryButton extends Button 
{ 
private DishCategory dishCategory = new DishCategory(); 
private Boolean isSelected = false; 


public DishCategoryButton(Context context, DishCategory dishCategory) 
{ 
    super(context); 
    this.dishCategory = dishCategory; 
    isSelected = false; 
    setTextColor(Color.WHITE); 
    setBackgroundDrawable(new PaintDrawable(Color.BLACK)); 
} 
public DishCategory getDishCategory() 
{ 
    return dishCategory; 
} 
public void setDishCategory(DishCategory dishCategory) 
{ 
    this.dishCategory = dishCategory; 
} 

public Boolean getIsSelected() { 
    return isSelected; 
} 

public void setIsSelected(Boolean isSelected) { 
    this.isSelected = isSelected; 
    if(isSelected == true) 
    { 
     setTextColor(Color.WHITE); 
     setBackgroundDrawable(new PaintDrawable(Color.GREEN)); 
    } 
    else 
    { 
     setTextColor(Color.WHITE); 
     setBackgroundDrawable(new PaintDrawable(Color.BLACK)); 
    } 
} 

}

+0

platziert ist nicht es Ansichten für Leistung und smooth scrolling recyceln sollte.Stattdessen müssen Sie Ihre Implementierung von gridview ändern – Raghunandan

+0

Könnten Sie mir erklären, was ich mit der Implementierung machen könnte? – Jesusrz001

+0

http://stackoverflow.com/questions/20611123/listview-subobject-clickable-confilct/20612237#20612237. für Listenansicht. Jetzt können Sie das selbe mit gridview – Raghunandan

Antwort

2

Verhindern, dass der Adapter aus Recycling-Ansichten auf Scroll

einfach nicht die convertView param verwenden weitergegeben getView() und immer Rückkehr ein frisch erzeugtes View.

Dies ist jedoch eine schlechte Lösung in Bezug auf die Leistung. Stattdessen sollte Ihr Ziel nicht sein, Recycling zu verhindern, sondern korrekt zu recyceln: Ihr getView() sollte die convertView in den ursprünglichen Zustand zurücksetzen.

Wenn also eine Änderung vorliegt, dass einige Ihrer Button-Eigenschaften von ihren nicht standardmäßigen Werten geändert werden, setzen Sie sie auf die Standardwerte in getView() zurück.

1
public View getView(int position, View convertView, ViewGroup parent) { 
     View itemview = null; 

     itemview = getLayoutInflater().inflate(R.layout.ordermini, parent,false); 

    } 

Dies wird helfen, eine neue Ansicht

15

Ein besserer Ansatz

recyclerView.getRecycledViewPool().setMaxRecycledViews(VIEW_TYPE,0);

aufzublasen

Sie müssen verwenden würde beachten Sie, dass dies die Leistung Ihres RecyclerView reduzieren.

Sie können die getItemViewType Methode außer Kraft setzen, wie unten erwähnt

@Override 
public int getItemViewType(int position) { 
    if (position == feedElements.size()) 
     return 3; 
    else if (feedElements.get(position).getType() == 1) 
     return 1; 
    else 
     return 2; 
} 
+2

implementieren Sie speicherten meinen Tag! –

+3

Jungs, wie bekommen wir den View-Typ? –

+0

@Kurlicue Ich habe meine Antwort aktualisiert! –

0

hatte ich genau dieses Problem So habe ich einige Code jeder überprüfen sehen, dass es nicht und hervorgehoben wurde, wenn es die markierte gefunden Sieh es an, änderte es zurück.

//--------SET-FOREGROUND-IMAGE-(BORDER)------------ 
    /*If the user clicks on an item and then scrolls down so the selected item is no longer in view Then the 
    Item that the user clicked on will be recycled with the foreground image. 
    This is BAD because when the user sees the selected item (as distinguished by it's different border) 
    it will be holding different data from a different data model item. 
    These following lines of code will change the colour of any non selected item back to normal and they will 
    colour of the selected views appropriately*/ 
     if(currentLine.getLineId() == clickedId) 
     {recycleHolder.cardView.setForeground(parentActivity.getResources().getDrawable(R.drawable.card_view_border_selected));} 
     else 
     {recycleHolder.cardView.setForeground(parentActivity.getResources().getDrawable(R.drawable.card_view_border));} 

und dieser Code innerhalb

@Override 
public void onBindViewHolder(final RecyclableViewHolder recycleHolder, int i) 
{ 
}