Автозаполнение текста в ListView

#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 . Довольно длительные действия, но приложение работает. Большое тебе спасибо, ты настоящий друг)))