2012-09-28 12 views
15

Ładuję kontakty telefoniczne w niestandardowym widoku listy. Każdy wiersz jest sprawdzanym LinearLayout zawierającym CheckedTextView i inny TextView.Nie można zaznaczyć/odznaczyć opcji CheckedTextView wewnątrz getView

Dostarczam widok listy niestandardowym ArrayAdapter. Mój problem polega na tym, że nie mogę kontrolować CheckedTextViews wewnątrz getView(). Na przykład, gdy próbuję wykonać następujące czynności:

public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null){    
      row = inflater.inflate(layout, parent, false); 
     } 

     CheckedTextView checkedTextView = (CheckedTextView) row.findViewById(R.id.checkedTextView); 
     checkedTextView.setText("A"); 
     checkedTextView.setChecked(true); 
     return row; 
    } 
To powinno sprawdzić każdy widok tekstu za każdym razem, gdy przewijam widok listy, ale tak się nie dzieje. Czy ktoś może mi powiedzieć, jak to zrobić?

EDIT: To jest ważne, aby sprawdzić go wewnątrz getView(), nie mogę po prostu sprawdzić wszystko po setListAdapter()

Edit2: Jest to plik XML przedstawiający widok każdego wiersza

<?xml version="1.0" encoding="utf-8"?> 
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckedTextView 
     android:id="@+id/checkedTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
     android:paddingBottom="0dp" 
     android:text="CheckedTextView" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/subTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Small Text" 
     android:paddingTop="0dp" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</com.example.multiplecontacts.CheckableLinearLayout> 

CheckableLinearLayout to niestandardowy układ, który rozszerza LinearLayout i implementuje Checkable, jak już wcześniej wspomniałem. I wziąłem go od here

+0

nie muszę go być domyślnie zaznaczone. Właściwie powyższy kod nie jest moim rzeczywistym kodem, to tylko próbka demonstrująca mój problem. Wszystko, czego potrzebuję, to móc przełączać się do CheckedTextView wewnątrz getView() –

+0

czy możesz opublikować xml –

+0

Masz układ z 'checkbox', ale kiedy naciśniesz' checkbox' nie jest zaznaczone? –

Odpowiedz

26

Czy ustawiłeś właściwość checkMark dla swojego CheckedTextView w swoim układzie xml?

Na przykład: android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextView nie jest tylko pole z tekstem. Trzeba także pamiętać, że nie jest aktywowana CheckedTextView lub klikać bez jakiejś manipulacji (ponieważ został zaprojektowany dla ListView, a zatem jest to państwo musi być kontrolowana przez ListView na setOnItemClickListener)

setChoiceMode powinny być ustalane dla ListView. Sprawdzanie wiersza wewnątrz adaptera getView powinno być wykonane przez: listView.setItemChecked(position, value)

+0

Zrobiłem. I jest zaznaczone/odznaczone normalnie, kiedy sam naciskam przedmiot. To właśnie wewnątrz getView() zachowuje się w ten sposób. –

+0

Więc można go kontrolować tylko w setOnItemClickListener? nie ma sposobu, aby go wyłączyć poza nią? –

+0

Gdzie ten fragment kodu powinien być napisany? Próbuję przełączać checkedTextView automatycznie, a nie po wydaniu zdarzenia onClick. Już zaimplementowałem naListItemClick i działa dobrze. –

1

Kiedykolwiek przewijasz listę, za każdym razem, gdy wywołuje ona metodę getview(). Tak więc, jeśli masz jakieś pole wyboru lub dowolne pole edycji w liście poleceń, zostanie ono ponownie zainicjowane.

Mój pomysł polega na zaznaczeniu pola wyboru (zaznaczone lub niezaznaczone). Więc tutaj użyłem ArrayList najpierw wypełniłem go fałszywą wartością, a potem kliknąłem na zdarzenie, którego użyłem do przechowywania aktualnego statusu.

class MyAdapter extends BaseAdapter implements OnClickListener { 

    private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to manage check box 

    private static LayoutInflater inflater=null; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> d) 
    { 
       inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     //fill with false values 
    for (int i = 0; i < d.size(); i++) 
    { 
      checks.add(i, false); 
    } 
    } 

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

    public Object getItem(int position) 
    { 
     return position; 
    } 

    public long getItemId(int position) 
    { 
     return position; 
    } 




     public View getView(int position, View convertView, ViewGroup parent) 
     { 

     View vi=convertView; 

     if(convertView==null) 

      vi = inflater.inflate(R.layout.<your layout>, null); 

      //Checkbox is of button type----android:button="@drawable/btn_check" 
      //make a selector xml for checkbox  

      checkBox=(CheckBox)vi.findViewById(R.id.check_box); 


      checkBox.setTag(Integer.valueOf(position)); 
      checkBox.setOnClickListener(this); 
      checkBox.setChecked(checks.get(position)); 


     return vi; 
    } 

     @Override 
     public void onClick(View v) 
     { 
      int viewId=v.getId(); 
      if(viewId== R.id.check_box) 
      { 
      Integer index = (Integer)v.getTag(); 
      boolean state = checks.get(index.intValue()); 
      checks.set(index.intValue(), !state); 

      } 
     } 
    } 

Aktualizacja: Rozwiązanie 2: Możesz umieścić zmienną boolean w klasie ViewHolder. Ta zmienna binarna służy do określenia, czy wybrano element, czy nie.

Mam nadzieję, że to powinno ci pomóc.

+0

checkBox.setChecked (checks.get (pozycja)); czy to działa z tobą? jest checkBox typu CheckedTextView lub po prostu checkbox? –

+0

@IslamHassan tak działa po mojej stronie. Tutaj moje pole wyboru ma typ przycisku. –

1

@ Pier-Luc Gendreau i @fox wspomnieli o rozwiązaniu w komentarzach, ale nie w odpowiedzi, więc zamieszczali odpowiedzi w ich imieniu.

Jak wspomniano przez @AlexOrlov, CheckedTextView nie można ustawiać, ani można klikać bez żadnej manipulacji. Musisz więc ustawić opcję sprawdzania pozycji za pomocą ListView, możesz to zrobić z samego adaptera lub z działania/fragmentu, w którym masz ListView.

Aby to zrobić z adapterem,

public View getView(int position, View convertView, ViewGroup parent) 
{ 
if (//logic) { 
((ListView) parent).setItemChecked(position, true); 
} 
} 

z działalności/fragment

if (//logic) { 
listView.setItemChecked(position, true); 
} 
Powiązane problemy