#android
#Android
Вопрос:
У меня есть ListView
содержит информацию о радиостанциях. Он состоит из нескольких пользовательских элементов ( TextView
CheckBox
) и встроен AutoCompleteTextView
вверху. Моя проблема в том, что я внедрил метод getView (), ListView's
Adapter
вероятно, неверный, потому что он хорошо прокручивается вверх и вниз, только если я не выбираю AutoCompleteTextView
, потому что после этого действия я получаю исключение NullPointerException. Чтобы было понятнее, вот фрагмент моего пользовательского кода адаптера:
class ImageAdapter extends ArrayAdapter<RadioStations> {
private Activity a;
private LayoutInflater inflater;
private View searchView;
private ArrayAdapter<RadioStation> mAdapter;
public ImageAdapter(Activity act, RadioStation[] objects) {
super(act, 0, objects);
a = act;
inflater = (LayoutInflater) a.getSystemService(LAYOUT_INFLATER_SERVICE);
mAdapter = new ArrayAdapter<RadioStation>(RadioStationListActivity.this, android.R.layout.simple_dropdown_item_1line, mStations);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "GETTING VIEW[" position "]");
final TextView NameOfStation;
CheckBox FavouriteFlag;
if(position == 0) {
Log.d(TAG, "Making AutoCompleteTextView");
searchView = inflater.inflate(R.layout.search_view, null);
((AutoCompleteTextView)searchView.findViewById(R.id.Seacrh_field)).setAdapter(mAdapter);
((AutoCompleteTextView)searchView.findViewById(R.id.Seacrh_field)).setOnItemClickListener(
new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
...
}
}
);
searchView.setFocusable(true);
return searchView;
}
if(convertView == null || convertView == searchView){
Log.w(TAG, "Convert view is null");
convertView = inflater.inflate(R.layout.radio_list_item, null);
}
final RadioStation station = getItem(position-1);
NameOfStation = (TextView) convertView.findViewById(R.id.name_of_chanel);
FavouriteFlag = (CheckBox) convertView.findViewById(R.id.favorite);
if(NameOfStation == null)
Log.d(TAG, "Name of station is null!!!!!!!!!");
NameOfStation.setText(station.toString());
FavouriteFlag.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...
}
});
FavouriteFlag.setFocusable(false);
return convertView;
}
}
Итак, если кто-нибудь увидит мою ошибку, я был бы рад воспользоваться вашим советом. Кстати, я получаю исключение NullPointerException при попытке поместить текст в NameOfStation
и это потому, что convertView остается видом поиска, несмотря на условие on
if(convertView == null || convertView == searchView)
convertView = inflater.inflate(R.layout.radio_list_item, null);
Ответ №1:
Если вид поиска должен быть частью списка и также должен прокручиваться вместе с ним, вы можете настроить его с помощью addHeaderView() класса ListView, чтобы добавить представление в начало списка, которое не управляется адаптером. Возможно, это упрощает логику вашего адаптера, поскольку он должен обрабатывать только «реальные» элементы списка.
Если вид поиска всегда должен быть вверху списка и не должен прокручиваться вместе с ним, вы можете просто переместить его над ListView в вашем файле макета. Это может улучшить пользовательский интерфейс.
Комментарии:
1. Спасибо за ваш ответ, но если я использую этот подход, я сталкиваюсь с другой проблемой: в моем методе on resume я всегда вызываю adapter.notifyDataSetChanged адаптера ListView. И я привел его к
BaseAdapter
. Теперь, когда я добавляю представление заголовка, я получаю ClassCastException. Есть ли у вас какие-либо мысли о том, как решить эту проблему2. Я сам ответил на свой вопрос. Мне просто нужно было привести
ListView
адаптер кHeaderViewListAdapter
классу, затем вызватьgetWrappedAdapter
метод и только после этого привести его кBaseAdapter
. Довольно длительные действия, но приложение работает. Большое тебе спасибо, ты настоящий друг)))