首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AndroidStudio,ArrayList+SearchBar,如何获得正确的活动

AndroidStudio,ArrayList+SearchBar,如何获得正确的活动
EN

Stack Overflow用户
提问于 2021-03-13 04:38:47
回答 1查看 23关注 0票数 0

我是一个初学者,我有一个项目要为学校做。所以问题是,每当我尝试通过单击列出的条目在Emulator上打开新活动时,我都会转到该活动,到目前为止一切正常,但问题是由于搜索栏的原因,条目的位置发生了变化。因此,正如你在我的代码中所看到的,赛博朋克永远是第一个入口,黑暗灵魂是第二个入口。但如果我特别在searchBar中寻找黑暗灵魂(它只会显示黑暗灵魂),我会得到赛博朋克活动的结果,因为它在位置1。

(我还没有完成其他条目的所有活动,尝试首先修复这个issure )

我已经尝试了if,switch等东西,但我只是得到了同样的结果。真的很感谢大家的帮助!:)

问候

以下是我的代码:

代码语言:javascript
复制
package at.fh.joanneum.smartplay;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;

public class Searchlist extends AppCompatActivity {

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


        final ArrayList<String> listGames = new ArrayList<>();
        listGames.add("Cyberpunk");
        listGames.add("Anno 1800");
        listGames.add("Dark Souls 3");
        listGames.add("Battlefield V");
        listGames.add("Minecraft");
        listGames.add("DayZ");
        listGames.add("Counter Strike");

        final ArrayList<Class> intents = new ArrayList<Class>();
        intents.add(Cyberpunk.class);
        intents.add(DarkSouls.class);


        ListView myListView = (ListView) findViewById(R.id.listview_activity_Searchlist);

        final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, listGames);
        myListView.setAdapter(adapter);


        SearchView mySearchView = (SearchView) findViewById(R.id.searchBar);
        mySearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String list) {
                adapter.getFilter().filter(list);
                return false;
            }
        });

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    Intent listIntent = new Intent(getApplicationContext(),
                            intents.get(position));
                    startActivity(listIntent);
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-13 05:15:31

顶部项目始终是第一个索引处的项目。由于您过滤了适配器,因此更改了项的顺序以及它们的位置,但是在从itemClick回调中的Intent列表加载Intent时,您没有考虑到这一点。您应该创建一个包含显示文本和意图的复杂对象,以便在调用onClick时,可以检索单击的项并从中获取意图。或者,您可以创建item-id和Intent的映射,然后使用click回调的id-参数来检索正确的intent。我推荐第一种解决方案。

创建一个像这样的对象

代码语言:javascript
复制
class GameData{
  private String text;
  private Intent intent;

  public GameData(String text, Intent intent){
    this.text = text;
    this.intent = intent;
  }      

  public Intent getIntent(){
     return intent;
  }

  public String toString(){
    return text;
  }
}

并用这些对象而不是字符串填充你的ArrayAdapter。单击该项后,从适配器中检索单击位置的项并调用其getIntent()方法。这将交付所需的意图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66606905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档