@Erimaru
Студент-программист

Как реализовать поиск по списку ListView?

Здравствуйте. Столкнулся с проблемой реализации поиска по списку. Пример кода я нашел в интернете, а вот как интегрировать этот код под своё приложение, я понять не могу(начинающий разработчик). Можете ли вы тыкнуть на ошибку(-и)? Вот код :
public class PhonesListMainActivity extends AppCompatActivity {


    private List<PhonesLists> phones = new ArrayList();
    ListView phonesList;
    ArrayList<String> phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phones_list_main);

        // начальная инициализация списка
        setInitialData();
        //получаем элемент ListView
        phonesList = (ListView) findViewById(R.id.phonesList);
        // создаем адаптер
       PhonesAdapter phonesAdapter = new PhonesAdapter(this, R.layout.activity_phones_lists, phones);
        // устанавливаем адаптер
        phonesList.setAdapter(phonesAdapter);
         //слушатель выбора в списке
        ListView phonesList = (ListView) findViewById(R.id.phonesList);


        phonesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position == 0) {
                    Intent intent = new Intent(view.getContext(), PixelActivity.class);
                    startActivityForResult(intent, 0);

                }
                if (position == 1){
                    Intent intent = new Intent(view.getContext(), GalaxyS8.class);
                    startActivityForResult(intent, 0);


                }
                if (position == 2){
                    Intent intent = new Intent(view.getContext(), IphoneActivity.class);
                    startActivityForResult(intent, 0);

                }
                if (position == 3){
                    Intent intent = new Intent(view.getContext(), G6.class);
                    startActivityForResult(intent, 0);

                }
                if (position == 4){
                    Intent intent = new Intent(view.getContext(), Nexus5x.class);
                    startActivityForResult(intent, 0);

                }

            }
        });
    }

    // Cписок
   private void setInitialData() {
        phones = new ArrayList<>();
        phones.add(new PhonesLists("Model : Google Pixel", "By Google",R.drawable.pixelforlist));
        phones.add(new PhonesLists("Model : Galaxy S8", "By Samsung",R.drawable.s8forlist));
        phones.add(new PhonesLists("Model : Iphone 7", "By Apple",R.drawable.iphone7forlist));
        phones.add(new PhonesLists("Model : G6", "By LG",R.drawable.g6forlist));
        phones.add(new PhonesLists("Model : Nexus 5x", "By LG",R.drawable.nexus5xforlist));

    }



    // ActionBar меню
    // Поиск
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_items, menu);

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                ArrayList<String> phlist = new ArrayList<String>();

                for (String ph : phone) {
                    if (ph.toLowerCase().contains(newText.toLowerCase())) {
                        phlist.add(ph);
                    }
                }
                PhonesAdapter phonesAdapter = new PhonesAdapter(PhonesListMainActivity.this, R.layout.activity_phones_lists, phones);
                // устанавливаем адаптер
                phonesList.setAdapter(phonesAdapter);

                return true;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
        });


        return super.onCreateOptionsMenu(menu);
    }


    // Элементы меню
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.settings:
                Toast.makeText(this, "Sorry, there is nothing here yet. Stay tuned.", Toast.LENGTH_SHORT).show();
                return true;
        }
        switch (item.getItemId()){

            case R.id.item_about:
                Intent intent = new Intent(this, AboutAcivity.class);
                startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }
}


Вот его layout " activity_phones_list_main " :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/phonesList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


А это menu.xml :
<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/settings"
        android:icon="@drawable/ic_settings_black_24dp"
        android:orderInCategory="1"
        android:title="@string/item_settings" />

    <item
        android:id="@+id/item_about"
        android:orderInCategory="1"
        android:title="@string/item_about"
        android:showAsAction="never"/>
    <item
        android:id="@+id/item_search"

        android:icon="@drawable/ic_action_search"
        android:title="Search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always|collapseActionView" />


</menu>


Надеюсь так будет понятно. Так вот, проблема в том, что когда нажимаешь на кнопку поиска, то приложение вылетает ? : ac050c4986cf4f168c634676877e6ed0.jpg
и ещё, как можно сделать так, чтобы поиск был только на странице со списком, а не на всех activity : 92ec3989dfa2417bb5b0f8bce6e2798e.jpg

Заранее спасибо!)
  • Вопрос задан
  • 1031 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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