Android Studio,ArrayList+Search Bar,如何获取正确的Activity

Posted

技术标签:

【中文标题】Android Studio,ArrayList+Search Bar,如何获取正确的Activity【英文标题】:AndroidStudio, ArrayList+SearchBar, how to get correct Activity 【发布时间】:2021-06-10 21:13:43 【问题描述】:

我是初学者,我有一个项目要为学校做。所以问题是,每当我尝试通过单击列出的条目在模拟器上打开一个新活动时,我都会进入该活动,到目前为止一切顺利,但问题是由于搜索栏,条目的位置发生了变化。所以就你在我的代码中所见,赛博朋克永远是第一个条目,而黑暗之魂永远是第二个。但是,如果我专门在搜索栏中寻找黑暗之魂(它只会显示黑暗之魂),我会得到赛博朋克活动,因为它位于位置 1。

(我还没有完成其他条目的所有活动,尝试先解决这个问题)

我已经尝试过 if、switch 等,但我得到了相同的结果。我真的很感激任何帮助! :)

问候

这是我的代码:

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);
            
        );
    

【问题讨论】:

【参考方案1】:

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

创建一个类似的对象

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() 方法。这将传递所需的 Intent。

【讨论】:

您好 Basti,感谢您的帮助,但我在弄清楚如何实现 getIntent() 方法时仍然遇到一些麻烦,问题是我无法在arraylist 因为它需要我移交一个 ArrayList

以上是关于Android Studio,ArrayList+Search Bar,如何获取正确的Activity的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList to String 没有Android Studio中的空格

Android Studio:使用 ListView 显示 SQLite 数据库行的 ArrayList

我在带有 Bundle 和 ArrayList 的 android studio 中出现错误

Recyclerview 适配器错误:Android Studio 中的 Arraylist 大小为零

Android Studio,ArrayList+Search Bar,如何获取正确的Activity

我可以在 Android Studio 中创建一个包含 TextViews 和 ImageViews 的 ArrayList 吗?