Выберите элемент в ListView, используя значение из намерения

#android #listview

#Android #listview

Вопрос:

Я пытаюсь выбрать элемент в на ListView основе значения, которое я получаю из намерения. Я пробовал ListView.setSelection , но это не работает.

 Intent i = this.getIntent();
String sp = i.getStringExtra("Sport");
for (int position = 0; position < sports.length; position  )
    if (sports[position].equals(sp)) {
        listView.setSelection(position);
    }
 

Вот остальная часть кода для контекста:

 protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sport_item);
    ListView listView = findViewById(R.id.listview);
    String[] sports = new String[] {
        "Soccer",
        "Running",
        "Swimming",
        "Volleyball",
        "Tennis"
    };

    ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.listview, R.id.textView, sports);
    listView.setAdapter(arrayAdapter);
    Button btnSelect = findViewById(R.id.btnSelect);
    listView.setChoiceMode(listView.CHOICE_MODE_SINGLE);
    
    btnSelect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (ListView.getCheckedItemPosition() != -1) {
                Intent i = new Intent(SportActivity.this, InformationActivity.class);
                i.putExtra("Sport", sports[listView.getCheckedItemPosition()]); |
                i.putExtra("Position", listView.getCheckedItemPosition());
                setResult(Activity.RESULT_OK, i);
                finish();
            } else
                Toast.makeText(SportActivity.this, "Ban chua lya chon", Toast.LENGTH_SHORT).show();
        }
    });
    
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Toast.makeText(SportActivity.this, "Sport selected :"   sports[i], Toast.LENGTH_SHORT).show();
        }
    });
    
    Intent i = this.getIntent();
    String sp = i.getStringExtra("Sport");
    for (int position = 0; position < sports.length; position  )
        if (sports[position].equals(sp)) {
            listView.setSelection(position);
        }
}
 

Ответ №1:

покажите больше кода, разместите его здесь. вы должны вызывать setSelected только после настройки адаптера, прежде чем в списке не будет содержимого, поэтому ничего не будет выбрано

в вашем случае ваша проблема вызвана, вероятно, сравнением String s с == operator . в Java он сравнивает объекты, и один, полученный из intent , и второй из массива, не являются одинаковыми объектами, даже если они имеют одинаковое содержимое (они по-прежнему представляют собой два объекта в двух отдельных местах, размещенных в памяти). используйте equals метод для сравнения только содержимого

 if(sports[position].equals(sp))
 

Комментарии:

1. Я добавил код. я изменил == -> равно, но это все то же самое

2. попробуйте поместить listView.setSelection внутрь new Runnable и установить его с помощью listView.post() метода. или вы можете переместить весь код с первого экрана (раздел, начинающийся со строки с getIntent() ) в onResume метод

3. и никогда не публикуйте скриншоты вашего кода, публикуйте его в виде текста, о котором идет речь, чтобы его можно было легко выбрать и скопировать для дальнейших изменений / исправлений при ответе на вопросы (как у меня)