2012-02-08 5 views
1

Я смотрю ниже с помощью элемента back back на прокрутке.Android: проблема со списком элементов списка в списке прокрутки

В моем приложении у меня есть список, требующий множественного выбора. Кроме того, это настраиваемый список, в котором выбор должен быть представлен изменением цвета элемента списка, а не на основе флажка. Для этого: В OnClick я проверяю, выбрана ли позиция или нет, а затем установите фон для элемента. Однако это имеет значение, когда я просматриваю список. Например: предположим, что в списке 50 наименований. И 10 видны одновременно. Я выбираю 5-й элемент, тем самым меняя фон. А потом прокручиваю список. После прокрутки видимой части списка, соответствующей предыдущему 5-му пункту, скажем, 15-й элемент в элементе списка, но 5-й индекс в видимой части, по-прежнему имеет фон, соответствующий выбранному состоянию. В то время как он не должен был быть установлен, так как я еще не выбрал 15-й элемент.

Я пробовал: a-В методе getView адаптера, если элемент не является одним из выбранных элементов, я устанавливаю другой фон другим. Попробовал - setBackgroundColor, а также setBackgrounddrawable. b- В xml установите cacheColorHint на прозрачный c- У вас есть селектор, прикрепленный к элементам, и элементы, отвечающие за состояние [нажато, выбрано] в onlcick.

Однако все же я не могу избавиться от нежелательного цвета фона для элемента при прокрутке.

Любая помощь. Я пробовал различные предложения, упомянутые в различных сообщениях в SO, но не до сих пор не удалось.

Я попытался

благодаря Прадип

+0

Вы повторно использовать свой convertView? Похоже, фон уже установлен, и вы не перезагружаете его, когда он повторно используется. – Blundell

+0

Согласитесь с @Blundell, вы должны опубликовать свой код адаптера. – dmon

ответ

1

это нормальное поведение ListView адаптера в андроиде, его GetView() вызывалась на каждом свиток и для каждого нового элемента списка его называет GetView, если ListView пункт в настоящее время не отображается в пользовательском интерфейсе, тогда его convertView равен нулю: во время listview принимает нагрузку только видимых элементов списка, если он показывает в момент 10 элементов из 50, тогда listView.getChildCount() вернет только 10 не 50. В вашем случае, когда вы выбираете 5, он отображает выбор для 5 + 10 (количество видимых элементов) = 15, 25, 35, 45 тоже. Чтобы решить эту проблему, у вас должен быть флаг, связанный с вашими данными listItem, например, если у вас есть массив arrayData [50] в качестве массива, тогда возьмите массив логических isSelected [50] с начальным значением false для каждого.

Посмотрите на GetView(), в классе адаптера:

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

     final ViewHolder holder; 
        string text = itemData[position] 
     if (convertView == null) { 
      rowLayout = (RelativeLayout) LayoutInflater.from(context) 
        .inflate(R.layout.list_view_item, parent, false); 
      holder = new ViewHolder(); 

      holder.txtString= (TextView) rowLayout 
        .findViewById(R.id.txtTitle); 
      rowLayout.setTag(holder); 
     } else { 
      rowLayout = (RelativeLayout) convertView; 
      holder = (ViewHolder) rowLayout.getTag(); 
     } 


     if(isSelected[position] == true){ 
        holder.txtString.setText("Selected") 
        rowLayout.setBackGround(selected) 
     }else{ 
          holder.txtString.setText("Not Selected") 
      rowLayout.setBackGround(notSelected) 
     } 




    public class ViewHolder { 
     public TextView txtString; 

    } 

и в своем классе активность на listView.setOnItemClickListener():

listView.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int position, long arg3) { 
        // TODO Auto-generated method stub 
         isSelected[position] = true // on selection 

         RelativeLayout rowLayout = (RelativeLayout) view; 
      rowLayout.setBackGround(Selected); 


         // also set here background selected for view by getting layout refference 


        } 
      }); 
+0

В вашем коде при нажатии строки относительное значение boolean равно true, но вы никогда не устанавливаете его в false при нажатии другой строки. Это ошибка? Если да, как я могу его решить? –

+0

над образцом было для выбора нескольких строк и просто логикой. Для вашей потребности вы можете использовать Array.fill (isSelected, false); как раз перед выбрано [position] = true; –

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