Как динамично обновить ListView на [закрытом] Android

У меня есть много друзей, которые клянутся CMake для кросс-платформенной разработки:

http://www.cmake.org/

Это - система сборки, используемая для VTK (среди прочего), который является библиотекой C++ с межплатформенным Python, Tcl и привязкой Java. Я думаю, что это - вероятно, наименее сложная вещь, Вы найдете с этим много возможностей.

Вы могли всегда пробовать стандарт автоинструменты . Автоmake-файлы довольно легко соединить, если Вы только работаете на Unix и если Вы придерживаетесь C/C++. Интеграция более сложна, и автоинструменты далеко от самой простой системы когда-либо.

159
задан Hamy 20 September 2014 в 18:18
поделиться

2 ответа

Во-первых, вам нужно создать макет XML, который имеет как EditText, так и ListView.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Pretty hint text, and maxLines -->
    <EditText android:id="@+building_list/search_box" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="type to filter"
        android:inputType="text"
        android:maxLines="1"/>

    <!-- Set height to 0, and let the weight param expand it -->
    <!-- Note the use of the default ID! This lets us use a 
         ListActivity still! -->
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
         /> 

</LinearLayout>

Это все выложит правильно, с красивым EditText над ListView. Затем создайте ListActivity, как обычно, но добавьте вызов setContentView () в метод onCreate () , чтобы использовать наш недавно объявленный макет. Помните, что мы специально идентифицировали ListView с помощью android: id = "@ android: id / list" . Это позволяет ListActivity знать, какой ListView мы хотим использовать в нашем объявленном макете.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.filterable_listview);

        setListAdapter(new ArrayAdapter<String>(this,
                       android.R.layout.simple_list_item_1, 
                       getStringArrayList());
    }

Запущенное приложение сейчас должно показать ваш предыдущий ListView с красивым окном выше. Чтобы заставить это поле что-то делать, нам нужно взять входные данные из него и сделать этот входной фильтр списком. Хотя многие люди пытались сделать это вручную, большинство классов ListView Adapter имеют объект Filter , который можно использовать для автоматического выполнения фильтрации. Нам просто нужно направить входные данные из EditText в фильтр . Оказывается, это довольно просто. Чтобы запустить быстрый тест, добавьте эту строку в свой onCreate () вызов

adapter.getFilter().filter(s);

. Обратите внимание, что вам нужно будет сохранить свой ListAdapter в переменной, чтобы эта работа работала - я сохранил my ArrayAdapter из ранее в переменную с именем «адаптер».

Следующим шагом является получение входных данных из EditText . На самом деле это требует некоторых размышлений. Вы можете добавить OnKeyListener () в свой EditText . Однако, этот слушатель получает только некоторые ключевые события . Например, если пользователь вводит «wyw», интеллектуальный текст, скорее всего, порекомендует «глаз». Пока пользователь не выберет «wyw» или «eye», ваш OnKeyListener не получит ключевого события. Некоторые могут предпочесть это решение, но меня это разочаровало. Я хотел каждое ключевое событие, поэтому у меня был выбор: фильтровать или нет. Решением является TextWatcher . Просто создайте и добавьте TextWatcher к EditText и передайте ListAdapter Filter запрос фильтрации каждый раз, когда текст изменяется. Не забудьте удалить TextWatcher в OnDestroy () ! Вот окончательное решение:

private EditText filterText = null;
ArrayAdapter<String> adapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.filterable_listview);

    filterText = (EditText) findViewById(R.id.search_box);
    filterText.addTextChangedListener(filterTextWatcher);

    setListAdapter(new ArrayAdapter<String>(this,
                   android.R.layout.simple_list_item_1, 
                   getStringArrayList());
}

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterText.removeTextChangedListener(filterTextWatcher);
}
286
ответ дан 23 November 2019 в 21:36
поделиться

запуск программы приведет к принудительному закрытию.

Я поменял строку:

android:id="@+building_list/search_box"

с

android:id="@+id/search_box"

может ли это быть проблемой? Для чего нужен '@+building_list'

?
10
ответ дан 23 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: