2

Проблема, которую я надеюсь решить здесь, заключается в том, что когда я нажимаю на один элемент в ListView, этот фон фона меняется на светло-серый, но когда я продолжаю прокручивать список, каждый 4-й элемент имеет фон, измененный на светло-серый, даже если эти другие элементы не были нажаты. Как сделать клик одним нажатием только элемента, который я нажал?Проблема с выбором ListView ... Использование onItemClick (AdapterView <?> parent, View view, ...)

ListView lv = (ListView) findViewById(R.id.resultsList); 
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelList.toArray(new String[labelList.size()]))); 

    lv.setOnItemClickListener(new OnItemClickListener() {  

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
      TextView tv = (TextView)view.findViewById(R.id.result); 
      tv.setBackgroundColor(Color.LTGRAY); 
      tv.setTextColor(Color.BLACK); 
     } 
    } 

ответ

1

Вы должны переопределить getView() в подклассе ListAdapter, в этом случае, ArrayAdapter.

Это потому, что Android фактически использует строки для экономии ресурсов и процессора (когда строка прокручивается с экрана, она используется для новых строк, которые появляются). Итак, если вы установите цвет фона в одну строку, он, скорее всего, снова будет использован, а фон будет по-прежнему серым.

Если вы подклассифицируете ArrayAdapter, вы можете установить в свой onItemClickListener какой-то флаг, а затем ваш ArrayAdapter getView(), вы можете установить соответствующий цвет фона на основе флага.

This link есть пример подклассов ArrayAdapter

+0

Спасибо за помощь! – searchMaker

+0

Что-то не так? частный класс LabelAdapter расширяет ArrayAdapter { \t частный String [] items; \t public LabelAdapter (контекстный контекст, int textViewResourceId, String [] строки) { \t супер (контекст, textViewResourceId, строки); \t this.items = строки; \t} \t \t @Override \t общественное мнение GetView (интермедиат положение, Вид convertView, ViewGroup родитель) { \t View v = convertView; \t TextView tt = (TextView) v.findViewById (R.id.result); \t tt.setText (items [position]); \t return v; \t} \t} – searchMaker

+0

Итак, действительно нет простого способа остановить переход от повторного использования видов? – searchMaker

0

Я полагаю, вы используете конвертировать вид, как эта

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

и вы меняете свой фон на 4-й позиции, и ваше мнение пусть говорит есть 6 строк на одной странице, поэтому каждая четвертая строка каждой страницы будет недоступна из-за повторного использования одного и того же конвертирования.

Я не знаю, что я объясняю правильно, но если вы используете convertview и меняете свой макет, так что у вас должна быть логика, чтобы снова создать этот макет, чтобы избежать повторного использования того же (кэшированного) представления.

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

  • Нет связанных вопросов^_^