TransWikia.com

Как правильно обработать нажатие в ListView что бы открывалась активити не по position а по id

Stack Overflow на русском Asked by BLCK4 on January 4, 2021

Как правильно обработать нажатие в ListView что бы открывалась активити не по position а по id допустим, т.к. он у меня в поиске.

Проблема в том что при поиске открывается совсем другая активити. Спасибо заранее!)

введите сюда описание изображения

public class Search extends AppCompatActivity {

    String[] items;
    ArrayList<String> listItems;
    ArrayAdapter<String> adapter;
    ListView listView;
    EditText editText;
    Intent intent;

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

        listView=(ListView)findViewById(R.id.listview);
        editText=(EditText)findViewById(R.id.txtsearch);
        initList();

        editText.addTextChangedListener(new TextWatcher() {

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

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.toString().equals("")){
                    // reset listview
                    initList();
                } else {
                    // perform search
                    searchItem(s.toString());
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
            }

        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                switch (position) {
                    case 0:
                        intent = new Intent(Search.this, SystemJS.class); //Заполняем Intent
                        break;
                    case 1:
                        intent = new Intent(Search.this, SD.class); //Заполняем Intent
                        break;
                    case 2:
                        intent = new Intent(Search.this, NR.class); //Заполняем Intent
                        break;
                    case 3:
                        intent = new Intent(Search.this, OD.class); //Заполняем Intent
                        break;
                    case 4:
                        intent = new Intent(Search.this, OP.class); //Заполняем Intent
                        break;
                    case 5:
                        intent = new Intent(Search.this, NJ.class); //Заполняем Intent
                        break;
                    case 6:
                        intent = new Intent(Search.this, MainActivity.class); //Заполняем Intent
                        break;
                    case 7:
                        intent = new Intent(Search.this, PD.class); //Заполняем Intent
                        break;
                    case 8:
                        intent = new Intent(Search.this, PD2.class); //Заполняем Intent
                        break;
                    case 9:
                        intent = new Intent(Search.this, PK.class); //Заполняем Intent
                        break;
                }
                startActivity(intent); //Запускаем активность
            }
        });

    }

    public void searchItem(String textToSearch){
        for(String item:items){
            String textToSearch1 = textToSearch.toLowerCase();

            if(!item.toLowerCase().contains(textToSearch1)){
                listItems.remove(item);
            }
        }
        adapter.notifyDataSetChanged();
    }

    public void initList(){
        items=new String[]{"Java","JavaScript","C#","PHP", "С++", "Python", "C", "SQL", "Ruby", "Objective-C"};
        listItems=new ArrayList<>(Arrays.asList(items));
        adapter=new ArrayAdapter<String>(this, R.layout.search_item, R.id.txtitem, listItems);
        listView.setAdapter(adapter);
    }

}

One Answer

Нужно изменить модель данных так, чтобы каждый элемент содержал свой id - вместо простых строк использовать собственный класс с полями "name" и "id".

В данном примере так же можно идентифицировать по самой строке, благо в качестве ключей для switch их тоже можно использовать:

String name = (String) parent.getItemAtPosition(position);
switch (name) {
    case "Java":
        intent = new Intent(Search.this, SystemJS.class); //Заполняем Intent
        break;
    case "JavaScript":
        intent = new Intent(Search.this, SD.class); //Заполняем Intent
        break;
    case "C#":
        intent = new Intent(Search.this, NR.class); //Заполняем Intent
    break;
    ...

Correct answer by woesss on January 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP