我正在尝试突出显示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>
... 这是simple_list_item_single_choice_custom.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"
/>
我也尝试不在onClick事件上调用super,并在代码中设置列表视图中的stackFromBottom,无论是true还是false,但这些似乎没有任何区别。
这样做有什么更令人满意,更直观的方式?
答案 0 :(得分:1)
伙计,我不敢相信我错过了这个。没有适当注意实际问题。
您正在尝试将selView的值设置为单击的项目,对吧?这就是onListItemClicked的“View v”参数。
View selView = v;
会做你想要的。
getChildAt()的行为与您期望的不一样,因为它继承自ViewGroup;在ListView中,它不一定只对应于列表项,因为ViewGroup中可能还有其他内容(例如,页眉和页脚)。简而言之,它并不意味着以您使用它的方式使用。它与这种情况下的位置成反比可能只是巧合。
答案 1 :(得分:0)
您是否有android:stackFromBottom指定的机会?我不知道这是否会改变getChildAt的行为(目前我没有任何东西可以测试),但这是我的第一次猜测。
答案 2 :(得分:0)
它应该设置为从顶部开始,但它从1开始(与数组索引等不同)。