2012-03-12 19 views
8

Ten wpis jest powiązany z tym ViewHolder not working. W tym poście korzystałem z samouczka na temat korzystania z ViewHolder na ListView. Teraz chcę mieć ostatni element na ListView, aby mieć inny układ niż reszta. Oto mój kod:Różne układy wierszy w ListView

int lastpos = mList.size()-1; 
      System.out.println("position: "+position+" mlist: "+lastpos); 

      if(position==lastpos){ 
      view = vi.inflate(R.layout.list_item_record, null); 
      holder.textView = (TextView)view.findViewById(R.id.record_view); 
      }else{ 
      view = vi.inflate(R.layout.list_item_bn, null); 
      holder.textView = (TextView)view.findViewById(R.id.tv_name); 
      } 
      view.setTag(holder); 

ja po prostu rozmiaru minus 1ListView i mieć stan, który sprawdza, czy aktualna pozycja jest równa ostatniej pozycji. Jednak ten kod ustawia układ ostatniego elementu tak samo jak resztę. getView metoda pełny kod:

private class CustomListAdapter extends ArrayAdapter { 
    private ArrayList mList; 
    private Context mContext; 

    public CustomListAdapter(Context context, int textViewResourceId, 
      ArrayList list) { 
     super(context, textViewResourceId, list); 
     this.mList = list; 
     this.mContext = context; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 

     final ToggleButton tb; 

     if (view == null) { 
      ViewHolder holder = new ViewHolder(); 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      int lastpos = mList.size()-1; 
      System.out.println("position: "+position+" mlist: "+lastpos); 

      if(position==lastpos){ 
      view = vi.inflate(R.layout.list_item_record, null); 
      holder.textView = (TextView)view.findViewById(R.id.record_view); 
      }else{ 
      view = vi.inflate(R.layout.list_item_bn, null); 
      holder.textView = (TextView)view.findViewById(R.id.tv_name); 
      } 
      view.setTag(holder); 
     } 

     final ItemsDisplay listItem = (ItemsDisplay) mList.get(position); 
      if (listItem != null) { 
      ViewHolder holder1 = (ViewHolder)view.getTag(); 
      holder1.textView.setText(listItem.getTag()); 

      view.setOnClickListener(new OnClickListener() { 
        public void onClick(View arg0) { //--clickOnListItem 
        Toast.makeText(getBaseContext(), 
         "Button is "+position+" "+listItem.getTag(), 
         Toast.LENGTH_LONG).show(); 
        } 
       }); 

       tb = (ToggleButton) view.findViewById(R.id.toggleButton); 
       tb.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

       if(tb.isChecked()){ 
       Toast.makeText(getBaseContext(), 
          "Button is "+position+" checked:"+tb.isChecked()+" "+listItem.getTag(), 
          Toast.LENGTH_LONG).show(); 
       }else{ 
       Toast.makeText(getBaseContext(), 
        "Button is "+position+" checked:"+tb.isChecked()+" "+listItem.getTag(), 
          Toast.LENGTH_LONG).show(); 
       } 
       } 
       }); 
      } 



     return view; 
    } 

} 

Czy ktoś może mi w tym pomóc?

+1

wklej swój pełny kod adaptera ... –

+0

dodał. to jest pełny kod. – antonoVodka

+0

jeśli pętla wywołuje funkcję check, jak gdyby (...) {Syso ("in if loop")} –

Odpowiedz

27

Wdrożenie getItemViewType() i getViewTypeCount() dla adaptera:

@Override 
public int getViewTypeCount() { 
    return 2; //return 2, you have two types that the getView() method will return, normal(0) and for the last row(1) 
} 

oraz:

@Override 
public int getItemViewType(int position) { 
    return (position == this.getCount() - 1) ? 1 : 0; //if we are at the last position then return 1, for any other position return 0 
} 

Następnie w getView() sposób dowiedzieć się, jaki rodzaj widzenia nadmuchać:

public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     int theType = getItemViewType(position); 
     if (view == null) { 
      ViewHolder holder = new ViewHolder(); 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      if (theType == 0) { 
       // inflate the ordinary row 
       view = vi.inflate(R.layout.list_item_bn, null); 
       holder.textView = (TextView)view.findViewById(R.id.tv_name);  
      } else if (theType == 1){ 
      // inflate the row for the last position 
       view = vi.inflate(R.layout.list_item_record, null); 
       holder.textView = (TextView)view.findViewById(R.id.record_view); 
      } 
      view.setTag(holder); 
     } 
//other stuff here, keep in mind that you have a different layout for your last position so double check what are trying to initialize 
} 

przykładzie z uwagami: http://pastebin.com/gn65240B (lub https://gist.github.com/2641914)

+0

Próbowałem, ale nadal nie działa. próbowałem wydrukować wartość pozycji i typ. pozycja dała mi 0-5 tylko z theType = 0. dlaczego? mList składa się z 26 elementów. Zastanawiam się tylko, dlaczego pozycje mają 6 wartości, a tylko 26 pozycji na mojej liście. – antonoVodka

+0

@ user1263567 Czy przewinąłeś listę w dół? Myślę, że to normalne, aby uzyskać pozycję 5-6, prawdopodobnie dlatego, że są to pozycje, które można zobaczyć na ekranie, byłoby niepotrzebne wywoływanie metody 'getView' dla pozycji, które jeszcze nie są widoczne. Jeśli przewiniesz listę, powinieneś zobaczyć także inne pozycje. – Luksprog

+0

Widzę. jednak ostatni rząd jest wciąż taki sam jak reszta. Próbowałem przenieść ostatni wiersz do pierwszego wiersza, aby sprawdzić, czy działa. działa, ale co 7 wiersz jest taki sam jak pierwszy wiersz. tylko 1 powinien być jedynym, który ma inny układ niż reszta. – antonoVodka

0

Problem polega na tym, że po zawyżeniu widoku można go wielokrotnie użyć w dowolnej pozycji. Proponuję następujące podejście: możesz normalnie nadmuchać wszystko oprócz ostatniego elementu (łącznie z uchwytem widoku), ale dla ostatniej pozycji przechowujesz referencję jako pole o numerze CustomListAdapter i zwracasz ją za każdym razem, gdy żądany jest ostatni element:

private class CustomListAdapter extends ArrayAdapter { 
    ... 
    private View mLastItem; 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     ... 
     int lastpos = mList.size()-1; 

     if (view == null) { 
      ViewHolder holder = new ViewHolder(); 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      if (position == lastpos) { 
       view = vi.inflate(R.layout.list_item_record, null); 
       holder.textView = (TextView)view.findViewById(R.id.record_view); 
       mLastItem = view; 
      } 
      else { 
       view = vi.inflate(R.layout.list_item_bn, null); 
       holder.textView = (TextView)view.findViewById(R.id.tv_name); 
      } 
      view.setTag(holder); 
     } 

     if (position == lastpos) { 
      ... // Update the last item here 
      return mLastItem; 
     } 
     ... 
    } 

} 
+0

to też nie działa. ustawia ostatni element z tym samym, co reszta. ale dziękuję. – antonoVodka

Powiązane problemy