Да, с точки зрения разработчика iOS, я нахожу, что чрезвычайно трудно применять такие функции, как " установка выбора по умолчанию при запуске " и " запоминание статуса выбора после того, как пользователь щелкнул строку"к ListView.
Итак, давайте сначала начнем с "запомнить выделение" . Проблема в том, что даже если вы знаете, что
Вы можете использовать селектор xml для определения стиля выделения / нажатия / фокусировки. Но этот стиль не будет
быть сохраненным после того, как пользователь щелкнул эту строку. Например, у меня есть селектор выделения xml (list_selector.xml в папке res / drawable), подобный этому (но у вас могут быть другие поля, которые необходимо выделить как цвет текста textview в строке):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/list_selector_pressed" android:state_selected="true" />
</selector>
и list_selector_pressed.xml, которые определили стиль выделения - установите цвет фона
до серого цвета:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_gray" />
</shape>
</item>
</layer-list>
Итак, как @David Hedlund предложил:
Скорее, назначьте OnItemClickListener, и пусть он сохранит идентификатор выбранного элемента в некоторой переменной.
вам нужно создать переменную экземпляра поверх вашего класса:
private View currentSelectedView;
затем перейдите к
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
Довольно просто: мы проверяем, является ли currentSelectedView нулевым или текущим просмотренным просмотром или нет. Сначала мы отключаем любой стиль, вызывая метод unhighlightCurrentRow (currentSelectedView) - вы можете задаться вопросом, почему мы передаем переменную currentSelectedView в качестве параметра, я объясню это позже. Затем мы назначаем представление для currentSelectedView и выделяем текущую строку; так что стиль будет сохраняться после нажатия пользователем.
private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.TRANSPARENT);
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.white));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(getResources().getColor(
R.color.dark_gray));
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.yellow));
}
Ага, вот и все. Вот как мы реализуем «запомнить выбор» для представления списка. Как вы видите,
мы должны продублировать коды для стилизации как в XML, так и в Java-коде - довольно глупо: (
Далее о «установить выбор по умолчанию» . Вы можете подумать, что вы можете сделать это
listView.setAdapter(adatper)
listView.setSelection(0);
currentSelectedView = listView.getChildAt(0);
highlightCurrentRow(currentSelectedView);
в onCreate () в активности или onActivityCreated () во фрагменте.
Но если вы запустите его, вы получите исключение NullPointer и почему?
потому что в настоящее время просмотр списка еще не отображается, а Android не нравится iOS, у которой есть viewWillAppear. Так что вам нужно создать мгновенную переменную, чтобы вспомнить, выполняется ли первый раз визуализация ячейки списка, и в onListItemClick снять эту переменную:
Таким образом, согласно объявлению currentSelectedView:
private Boolean firstTimeStartup = true;
затем добавьте методы: предположим, что мы хотим выделить первую строку в списке:
public class HomeAdapter extends ArrayAdapter<String> {
int layoutResourceId;
public HomeAdapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
layoutResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
layoutResourceId, null);
}
if (firstTimeStartup && postion == 0) {
highlightCurrentRow(convertView);
} else {
unhighlightCurrentRow(convertView);
}
TextView title = (TextView) convertView
.findViewById(R.id.menuTitle);
title.setText(getItem(position));
return convertView;
}
}
Довольно просто.
Но вам нужно внести некоторые изменения в метод onListItemClick:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (firstTimeStartup) {// first time highlight first row
currentSelectedView = l.getChildAt(0);
}
firstTimeStartup = false;
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
Вот, пожалуйста! Наслаждайтесь Android:)