Android: Listview, просмотр - подсвечивание правильного ряда - PullRequest
0 голосов
/ 21 мая 2011

Я пытаюсь выделить выбранную строку в программе Android викторины. Однако у меня странное поведение. По сути, позиция, передаваемая в onListItemClick, правильно отражает позицию в массиве вспомогательных данных, но представление, по-видимому, проверенное с использованием дочернего индекса, является неправильным. Дочерний индекс выглядит как обратная позиция, как стек. Используя это предположение, я могу заставить код работать, но он нелогичен.

Вот код:

public class QuestionActivity extends ListActivity {

...

        /*
         * Create the adapter
         */
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.simple_list_item_single_choice_custom,
                mAppState.mAnswerArray) {
        };

        /* attach the adapter to the ListView */
        setListAdapter(adapter);

        /* set ListView's choice mode to single */
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }

....

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);


    // always four rows; assume last row is zeroth child. Therefore,
    // if the first row is chosen (0 position) you need to get child 3.
    // 3 - 0 = 3.

    int childCount = l.getChildCount();
    int lastViewPos = childCount - 1;
    View selView = l.getChildAt(lastViewPos - position);
}

...

    <TextView android:id="@+id/display_question"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:textSize="40sp" android:typeface="normal" android:padding="10dp"
        android:layout_gravity="center_vertical|center_horizontal"
        android:textColor="@color/text_color" />
    />

    <ListView android:id="@+id/android:list"
        android:cacheColorHint="#00000000" android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:textColor="@color/text_color"
        android:divider="#00000000" android:dividerHeight="0sp"
        android:focusable="false">
    </ListView>
    <TextView android:id="@+id/display_english"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:paddingLeft="20dp" android:layout_gravity="center_vertical|center_horizontal"
        android:textSize="30sp" android:textColor="@color/text_color" />

    <Button android:id="@+id/next_button1" android:text="@string/next_question"
        android:textSize="15dp" android:layout_gravity="center_vertical|center_horizontal"
        android:textColor="@color/text_color" android:background="@drawable/custom_button"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>

... Вот простой список_сайтов_кожей_климат.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textSize="30sp" 
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorSingle"
    android:paddingLeft="20dip" 
    android:textColor="@color/text_color"
    android:background="@drawable/custom_list"
/>

Я также пытался не вызывать super для события onClick и устанавливать stackFromBottom в представлении списка из кода, как true, так и false, но ни один из них, казалось, не имел никакого значения.

Какой более удобный и интуитивно понятный способ сделать это?

Ответы [ 3 ]

1 голос
/ 21 мая 2011

Человек, я не могу поверить, что я пропустил это.Не обращал должного внимания на фактический вопрос.

Вы пытаетесь установить значение selView для элемента, который был нажат, верно?Это то, что является параметром "View v" onListItemClicked.

View selView = v;

сделает то, что вы ищете.

getChildAt () не ведет себя так, как вы ожидаете, потому что он унаследован от ViewGroup;в ListView это не обязательно соответствует только элементам списка, потому что могут быть другие вещи в ViewGroup (например, верхние и нижние колонтитулы).Короче говоря, он не предназначен для использования так, как вы его используете.То, что оно обратно соответствует позициям в этом случае, вероятно, просто совпадение.

0 голосов
/ 21 мая 2011

Должен быть установлен, чтобы начинаться сверху, но он начинается с 1 (в отличие от индексов массива и тому подобное).

0 голосов
/ 21 мая 2011

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

...