ListView устанавливает цвет фона для элемента ОШИБКА

Ну, у меня есть горизонтальный LinearLayout с элементами пользовательского класса.

Что я хочу: изменить цвет фона элемента, на который я нажал (например, если он выбран). Если пользователь щелкнет другой элемент, первый снова изменится на исходный цвет, а новый изменится на «выбранный цвет».

В чем моя проблема: это прекрасно работает, когда все элементы listView помещаются на экране (в данном случае 3 элемента). Если элементов больше, скажем, 7, если пользователь щелкнет элемент номер 0, он изменит цвет, но если пользователь прокрутит до последнего элемента и щелкнет элемент номер 6, он изменит цвет, но элемент 0 не изменится. Если оба элемента видны, все работает нормально.

это код моего onItemClickListener.

listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {

                for(int i=0;i<listView.getCount();i++){
                    try{

                        getViewByPosition(i, listView).setBackgroundResource(R.drawable.skin);
                        listView.getChildAt(i).setBackgroundResource(R.drawable.skin);
                    }
                    catch(Exception e){
                        System.out.println(e.toString());
                    }                       
                }

                view.setBackgroundResource(R.drawable.skin_selected);   
            }                                       
});

person Borja    schedule 18.02.2015    source источник


Ответы (1)


почему бы не использовать адаптер для модификации? Я предполагаю, что вы используете специальный адаптер?

в тебе адаптер

public int selectedItem;
.
//Rest of the stuff
.
.
 @Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    if (null == convertView) {
        LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_item, parent, false);
    }

    if(selectedItem==position){
        convertView.setBackgroundResource(R.drawable.skin_selected);
    }else{
        convertView.setBackgroundResource(R.drawable.skin);
    }

    return convertView;
}

и ваш прослушиватель onclick становится:

 listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
            ((NameOfYouAdpater)listView.getAdapter()).selectedItem=position;
            ((NameOfYouAdpater)listView.getAdapter()).notifyDataSetChanged();
        }                                       
});

И я заметил, что вы используете собственное представление списка само по себе. Может быть, изучить реализацию библиотеки, чтобы проверить наличие помех?

РЕДАКТИРОВАТЬ: причина вашей проблемы, скорее всего, заключается в том, чтобы просмотреть переработку. Цвет фона не обновляется, потому что каждый раз, когда элемент списка находится за пределами вашего ViewPort, представление перерабатывается.

person Droidekas    schedule 18.02.2015
comment
Делать это с помощью моего пользовательского адаптера очень просто. - person Borja; 18.02.2015