2013-08-23 2 views
5

У меня есть пользовательский список и пользовательский адаптер. При щелчке по строке этого списка текст TextView установлен на белый, а на фоне этой строки - черный.setOnItemClickListener в ListView, влияющем на несколько строк

Все хорошо, но при нажатии строки другие строки имеют цвет фона, установленный на черный, и при прокрутке вверх и вниз все испортится.

GetView() в пользовательских адаптер

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; 
} 

В mainactivity:

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); 
     } 

    }); 

Я попробовал класть на setOnItemClickListener в GetView(), но не повезло либо ..

Любая помощь? Благодарю.

ответ

6

Таможенной ListViews «создать» вид для показа только строки, когда прокрутка вниз следующей строки будет затронута, как первая.

Чтобы предотвратить эту проблему, вам необходимо создать логическое поле в ListItem Нажато;

Затем при нажатии на вид, то item.Clicked установлен в истинной где в GetView()

final ListItem item = items.get(position); 

и

List<ListItem> items; 

в качестве переменной адаптеров

Реализация:

Вы должны установить setOnClickListener в вашем GetView(), как показано ниже

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

Это сработало для меня спасибо – ralph

+0

@Chris: 'vi.setOnClickListener' или' vi.setOnItemClickListener'? –

+0

@ LuisA.Florit vi.setOnItemClickListener конечно :) – creativecreatorormaybenot

0

Это действие по умолчанию цвета кэша намека просмотра списка можно избежать, установив «Android: cacheColorHint» свойство @null как этого

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

Я не думаю, что моя проблема в том, что в XML .. Я перепробовал все возможные способы исправить его из xml (удаление фокуса и щелчка для всех элементов + ваше предложение), но это не сработало. – ralph

Смежные вопросы