2013-08-23 11 views
5

Mam niestandardowy widok listy i niestandardowy adapter. Po kliknięciu rzędu tego widoku listy tekst w widoku TextView jest ustawiony na biały, a tło tego wiersza jest czarne.setOnItemClickListener w ListView wpływające na wiele wierszy

Wszystko jest dobrze, ale po kliknięciu wiersza inne wiersze mają również kolor tła ustawiony na Czarny, a podczas przewijania w górę iw dół wszystko będzie zepsuć.

getView() w niestandardowych adaptera

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ListItem holder; 
    View vi=convertView; 

    if(vi==null){ 
     vi = inflater.inflate(R.layout.list, null); 
     holder = new ListItem(); 
     holder.nametext= (TextView) vi.findViewById(R.id.name); 
     vi.setTag(holder); 

    }else{ 
     holder = (ListItem) vi.getTag(); 
    } 

    holder.nametext.setText(""+item.name); 
    return vi; 
} 

W główną działalność:

CustomAdapter listadapter = new CustomAdapter(context, R.layout.list, items); 
list.setAdapter(listadapter); 

    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adapter, View view, int position, long arg){ 
       TextView v = (TextView) view.findViewById(R.id.name); 
       view.setBackgroundColor(Color.BLACK); 
       v.setTextColor(Color.WHITE); 
     } 

    }); 

Próbowałem puttin się setOnItemClickListener w getView(), ale bez powodzenia obu ..

Każda pomoc? dzięki.

Odpowiedz

6

zwyczaj listviews „stworzyć” widokiem na pokaz tylko wiersze, podczas przewijania w dół następnego wyświetlanego wiersza zostanie zmieniony jak pierwszy.

Aby temu zapobiec, musisz utworzyć pole logiczne w ListItem Kliknięte;

Następnie po kliknięciu widzenia item.Clicked jest ustawiony na prawdziwej gdzie w getView()

final ListItem item = items.get(position); 

i

List<ListItem> items; 

jako zmiennej adapter na

Realizacja:

Musisz ustawić setOnClickListener w getView() jak poniżej

vi.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View arg1) { 

      if(previousView!=null){ 
       ListItem previousItem = items.get(previousPosition); 
       previousItem.Clicked = false; 
      } 

      item.Clicked = true; 
      previousView = arg1; 
      previousPosition = position; 
      notifyDataSetChanged(); 
     } 

    }); 



    if(!item.isClicked){ 
     holder.nametext.setTextColor(Color.BLACK); 
     vi.setBackgroundColor(Color.WHITE); 
    }else{ 
     holder.nametext.setTextColor(Color.WHITE); 
     vi.setBackgroundColor(Color.BLACK); 
    } 

}); 
+0

To zadziałało dla mnie bardzo dziękuję – ralph

+0

@Chris: 'vi.setOnClickListener' lub' vi.setOnItemItClickListener'? –

+0

@ LuisA.Florit vi.setOnItemClickListener oczywiście :) – creativecreatorormaybenot

0

Jest to domyślny efekt koloru cache nutą widoku listy można uniknąć poprzez ustawienie „android: cacheColorHint” właściwość @null like this

<ListView 
     android:id="@+id/lstEventComment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"  
     android:cacheColorHint="@null" 
/> 
+0

Nie sądzę, że mój problem jest z powodu xml .. Próbowałem wszystkich możliwych sposobów napraw to z xml (usuwając fokusowalne i klikalne dla wszystkich elementów + twoją sugestię), ale to nie zadziałało. – ralph

Powiązane problemy