у меня есть ListView (lvProperties), адаптер которого является пользовательским ListAdapter (не ArrayAdapter). Этот адаптер получает данные из переменной экземпляра раздела пользовательского типа (содержащего несколько строк, целых чисел, списков массивов и методов).
Мне нужно, чтобы этот список ВСЕГДА отображал выбор (всегда должен быть выбранный элемент, даже при запуске активности).
При использовании простого ArrayAdapter в прошлом было бы достаточно этого:
lvProperties.requestFocus();
lvProperties.setSelection(0);
Однако в данном случае это вообще не работает. Я искал SO и Интернет и использовал:
lvProperties.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvProperties.setFocusable(true);
lvProperties.setFocusableInTouchMode(true);
lvProperties.requestFocus();
lvProperties.setSelection(0);
И все равно ничего.
Мой списокадаптер:
lvProperties.setAdapter(new ListAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v=convertView;
if(v==null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v=vi.inflate(R.layout.detail_row1, null);
}
TextView name=(TextView)v.findViewById(R.id.propName);
TextView value=(TextView)v.findViewById(R.id.propValue);
if(name!=null) {
name.setText(section.propNames.get(position));
}
if(value!=null) {
value.setText(section.propValues.get(position));
}
return v;
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {}
@Override
public void registerDataSetObserver(DataSetObserver observer) {}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return section.propNames.size();
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
});
Мой нереализованный OnItemSelectedListener:
lvProperties.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
И мой detail_row1.xml (далее я буду реализовывать макеты для строк, но сейчас это так:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:padding="6dip"
>
<TextView
android:id="@+id/propName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:gravity="center_vertical|left"
android:paddingTop="10sp"
android:paddingBottom="10sp"
android:paddingLeft="4sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:id="@+id/propValue"
android:textColor="#000000"
android:textSize="16sp"
android:textStyle="bold"
android:paddingTop="10sp"
android:paddingBottom="10sp"
android:paddingRight="4sp"
android:gravity="center_vertical|right"
/>
</LinearLayout><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:padding="6dip"
>
<TextView
android:id="@+id/propName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"
android:gravity="center_vertical|left"
android:paddingTop="10sp"
android:paddingBottom="10sp"
android:paddingLeft="4sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:id="@+id/propValue"
android:textColor="#000000"
android:textSize="16sp"
android:textStyle="bold"
android:paddingTop="10sp"
android:paddingBottom="10sp"
android:paddingRight="4sp"
android:gravity="center_vertical|right"
/>
</LinearLayout>
любая помощь/указатель на руководство о том, как это сделать? Я не хочу использовать drawable, просто селектор по умолчанию для темы, которую я использую.
Опять же, в списке всегда должна быть одна выбранная запись.
Я понимаю, что по дизайну это не предназначено для списков, НО это один из тех случаев, когда один размер не подходит всем.
BaseAdapter
вместо того, чтобы создавать чистыйListAdapter
прямо из интерфейса, и посмотреть, поможет ли это. Я понятия не имею, почему тип адаптера может на что-то повлиять. Определение layout может быть важным, если что-то в нем меняется/мешает выделению выделения, но это не должно иметь значения, является ли адаптерArrayAdapter
,CursorAdapter
илиBaleOfHayAdapter
. - person CommonsWare   schedule 23.08.2012