Изменение фокуса ListItem

У меня есть собственный listView с некоторыми представлениями (например, textView и imageView). Я хочу изменить цвет фона элемента списка, когда он получает фокус. Я установил OnfocusChange для своего конвертируемого представления, но это не работает. это мой класс держателя:

private class Holder {
    ImageView iconImage;
    TextView titleText ;
    TextView costText ;
    }

и метод getView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Item item = item.get(position);

    final Holder temp;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item, null);
        temp = new Holder();
        temp.iconImage = (ImageView) convertView
                .findViewById(R.id.iconImageView);

        temp.titleText = (TextView) convertView
                .findViewById(R.id.titleTextView);
        temp.costText = (TextView) convertView
                .findViewById(R.id.costTextView);

        convertView.setTag(temp);
    } else {
        temp = (Holder) convertView.getTag();
    }
    temp.titleText.setText(item.getItemTitle());
    //this focus listener doesn't work.
    convertView.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                temp.titleText.setBackground(context.getResources()
                        .getDrawable(
                                R.drawable.green_background));

            } else {
                temp.titleText.setBackground(context.getResources()
                        .getDrawable(R.drawable.black_background));
            }
        }
    });

}

как я могу установить прослушиватель OnFocusChange для каждого элемента списка в моем представлении списка?


person Milad Faridnia    schedule 10.09.2014    source источник
comment
этот ваш код должен сделать это, если вы добавили этот адаптер в свой список   -  person Metehan    schedule 10.09.2014


Ответы (2)


Вы пытались установить для focusable и focusableintouchmode значение true?

android:focusable="true"
android:focusableInTouchMode="true"

и попробуйте установить фокус для текстовых представлений и изображений в значение false.

person TheAndroidFreak    schedule 10.09.2014
comment
Да, я сделал это. Но возникает другая проблема. Фокус предназначен только для элементов, отображаемых на экране, и все остальные элементы в listView, которые не отображаются на экране, не могут получить фокус. Когда я использую клавиатуру, чтобы перейти к списку, фокус не остается в listView. Фактически, когда он достигает элементов, расположенных в нижней части экрана, listView теряет фокус и не прокручивается вниз. - person Milad Faridnia; 13.09.2014

После нескольких поисков я обнаружил, что работа с focus в представлении списка для изменения фона элемента списка при его выборе не является хорошим решением. потому что фокус не остается в виде списка после того, как он достигает конца экрана. На самом деле, если вы установите прослушиватель onFocusChange для вашего listView, он больше не прокручивается вниз (конечно, с клавиатурой), и лучшим решением для решения этой проблемы является setOnItemSelected. Если вы хотите получить более подробную информацию о решении, вы можете взглянуть на этот вопрос:

Программно выбрать элемент ListView в Android

Дополнительная информация: я разрабатываю приложение для ТВ, и у него нет сенсорного экрана. Я должен обрабатывать все события клавиатуры. Так что, возможно, эта проблема не возникает у обычных разработчиков приложений.

person Milad Faridnia    schedule 13.09.2014