цвет фона элемента listview меняется при прокрутке,

У меня есть listview, в котором я показываю списки файлов и папок. Я использую свой метод getView как

static class ViewHolder {
    protected TextView text1;
    protected TextView text2;
}

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

    ViewHolder viewHolder = null;

    if(convertView == null){

        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
        convertView = inflater.inflate(R.layout.row, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.text1 = (TextView) convertView.findViewById(R.id.text1);
        viewHolder.text2 = (TextView) convertView.findViewById(R.id.text2);

        convertView.setTag(viewHolder);

    }
    else{
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.text1.setText(itemsArrayList.get(position).getFileName());
    viewHolder.text2.setText(itemsArrayList.get(position).getSize());

    <if( itemsArrayList.get(position).isHidden() ) {
        convertView.setBackgroundColor(context.getResources().getColor(R.color.hiddenColor));
    }

    return convertView;
}

Если файл/папка скрыта, я изменяю цвет фона элемента списка как hiddenColor,
(цвет фона по умолчанию указан в XML)

Но при прокрутке он устанавливает почти весь цвет фона элемента списка как скрытый цвет.

Я знаю, что это связано с переработкой списка, но не знаю, как это решить.


person Pratapi Hemant Patel    schedule 28.03.2014    source источник
comment
проверьте это для справки stackoverflow.com/questions/20611123/ . Меняет текст и цвет по клику.   -  person Raghunandan    schedule 28.03.2014


Ответы (4)


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

if( itemsArrayList.get(position).isHidden() ) {
    convertView.setBackgroundColor(context.getResources().getColor(R.color.hiddenColor));
} else {
   **convertView.setBackgroundColor(Put your other color here)**
}
person Alex    schedule 28.03.2014

поместите android:fadingEdge="none" в xml

person Lucian Novac    schedule 28.03.2014

попробуйте добавить это в файл xml

android:cacheColorHint="@android:color/transparent"
person Rat-a-tat-a-tat Ratatouille    schedule 28.03.2014

Вы должны раздуть макет для каждого элемента и вернуть новый вид. Listview использует то же представление для других элементов.

удалите if(convertView == null) , чтобы у каждого элемента был другой объект представления.

Другой способ - добавить позицию в держатель просмотра и проверить

 if(convertView == null || contentView.getTag().position != position)
person Libin    schedule 28.03.2014
comment
Если мы будем надувать каждый элемент каждый раз, это выдаст исключение памяти, и приложение вылетит после некоторой прокрутки. Я пробовал этот раньше. - person Pratapi Hemant Patel; 28.03.2014
comment
Никакое представление списка не будет удерживать элементы, которые находятся только в памяти. Такой подход используется в расширенных элементах списка, которые обрабатывают различные действия (например, если элемент списка должен прокручивать свой тест внутри) - person Libin; 28.03.2014