java - 如何在 json 对象的 ListView 中进行搜索?

标签 java android json listview retrofit

我有一个 ListView ,其中填充了使用改造从 URL 获取的 json 对象。

每个对象都有一个详细信息页面,单击该对象时会显示该页面。

如何在 ListView 中搜索对象并通过单击结果显示正确的对象及其详细信息页面?

我已经尝试过searchview,我认为这只是一个过滤器而不是真正的搜索,因为它只显示与我插入的搜索字符串匹配的对象,但是当我单击过滤的对象时,它仍然给我最初列出的项目位置。

公共(public)类 SearchTafelnActivity 扩展了 AppCompatActivity {

SearchView sv;



private List<TafelnCall> tafelItems;
private ArrayAdapter<String> adapter;
private ProgressBar progressBar;


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    return true;
}

@Override
protected void onNewIntent(Intent intent) {

    handleIntent(intent);
}

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

    progressBar = findViewById(R.id.pBar);
    progressBar.setVisibility(View.VISIBLE);

    handleIntent(getIntent());


    /*final SearchView searchView = (SearchView) findViewById(R.id.searchView);
    searchView.onActionViewExpanded();
    searchView.setIconified(true);


    searchView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            searchView.setIconified(false);
        }
    });*/





        BottomNavigationView navigation = findViewById(R.id.bot_nav);
        BottomNavigationViewHelper.disableShiftMode(navigation);//Dont forgot this line

        Menu menu = navigation.getMenu();
        MenuItem menuitem = menu.getItem(3);
        menuitem.setChecked(true);

    //Switch activities
        navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch(item.getItemId()){
                    case R.id.nav_home:

                     Intent intent0 = new Intent(SearchTafelnActivity.this, MainActivity.class);
                    startActivity(intent0);
                    break;

                    case R.id.nav_news:

                    Intent intent1 = new Intent(SearchTafelnActivity.this, NewsActivity.class);
                    startActivity(intent1);
                        break;

                    case R.id.nav_money:

                    Intent intent2 = new Intent(SearchTafelnActivity.this, DonateActivity.class);
                    startActivity(intent2);
                        break;

                    case R.id.nav_search:

                    /*Intent intent3 = new Intent(SearchTafelnActivity.this, SearchTafelnActivity.class);
                    startActivity(intent3);*/
                        break;


                }
                return false;
            }
        });



        final ListView listView = (ListView) findViewById(R.id.listView);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TafelnCall tafelitem = tafelItems.get(position);
                Intent intent = new Intent(SearchTafelnActivity.this, TafelDetailPage.class);

                String tName = tafelitem.getName();
                String tAdress = tafelitem.getAddress();
                String tContact = tafelitem.getContactPerson();
                String tPhone = tafelitem.getPhone1();
                String tMail = tafelitem.getEmail();
                String tLong = tafelitem.getLongitude();
                String tLat = tafelitem.getLatitude();
                String tStreet = tafelitem.getAddress();
                String tZip = tafelitem.getZip();

                intent.putExtra( "key_tName", tName);
                intent.putExtra( "key_tAdress", tAdress);
                intent.putExtra( "key_tContact", tContact);
                intent.putExtra( "key_tPhone", tPhone);
                intent.putExtra( "key_tMail", tMail);
                intent.putExtra("key_tLong", tLong );
                intent.putExtra("key_tLat", tLat);
                intent.putExtra("key_tStreet", tStreet);
                intent.putExtra("key_tZip", tZip);


                startActivity(intent);

            }
        });

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        Api api = retrofit.create(Api.class);

        Call<List<TafelnCall>> call = api.getTafeln();



        call.enqueue(new Callback<List<TafelnCall>>() {

            @Override
            public void onResponse(Call<List<TafelnCall>> call, Response<List<TafelnCall>> response) {

                tafelItems = response.body();

                final String [] tafelNames = new String[tafelItems.size()];

                for(int i =0; i< tafelItems.size(); i++){
                    final TafelnCall tafelnCall = tafelItems.get(i);
                    tafelNames[i] = tafelnCall.getName();
                  /*tafelNames[i] = tafelnCall.getAddress();
                    tafelNames[i] = tafelnCall.getAddressAdd();
                    tafelNames[i] = tafelnCall.getCarrier();
                    tafelNames[i] = tafelnCall.getCategory();
                    tafelNames[i] = tafelnCall.getCity();*/




                }

                adapter = new ArrayAdapter<>(
                        getApplicationContext(),
                        R.layout.listitem,
                        tafelNames
                );

                listView.setAdapter(adapter);

                progressBar.setVisibility(View.GONE);


                //Search function start
                sv = findViewById(R.id.searchView);
                sv.setQueryHint("Suche");
                sv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        sv.setIconified(false); //makes whole searchview clickable
                    }
                });


                sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String text) {
                        return false;
                    }

                    @Override
                    public boolean onQueryTextChange(String text) {
                        adapter.getFilter().filter(text);



                        return false;
                    }
                });



                ////Search function end



            }



            @Override
            public void onFailure(Call<List<TafelnCall>> call, Throwable t) {
                Toast.makeText(getApplicationContext(), "Fehler beim Laden", Toast.LENGTH_SHORT).show();
            }


        });


    }
private void handleIntent(Intent intent) {

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        //use the query to search your data somehow
    }
}

}

最佳答案

我将过滤器直接应用于 ListView,而不是适配器...这些是我的覆盖:

public boolean onQueryTextChange(String newText) {
    if (TextUtils.isEmpty(newText)) {
        breedListView.clearTextFilter();
    } else {
        breedListView.setFilterText(newText.toString());
    }
    return true;
}

public boolean onQueryTextSubmit(String query) {
    if (TextUtils.isEmpty(query)) {
        breedListView.clearTextFilter();
    } else {
        breedListView.setFilterText(query.toString());
    }
    return false;
}

我的breedListView和你的listView一样

final ListView listView = (ListView) findViewById(R.id.listView);
// Here is how you would do it
listView.setFilterText(query.toString());

以下是一些设置

public class DogGuideFragment extends ListFragment
    …
private ListView breedListView;
… 
//In a ListFragment, getListView() gets the main ListView of the Fragment
breedListView = getListView();
breedListView.setFastScrollEnabled(true);
    breedListView.setTextFilterEnabled(true);
…
//setListAdapter is a method of a ListFragment that sets the data for the ListView
setListAdapter(new ArrayAdapter<String>(thisContext,
                        android.R.layout.simple_list_item_1, listOfBreeds));

关于java - 如何在 json 对象的 ListView 中进行搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56428068/

相关文章:

Python 创建 Google 存储桶

java - 为什么在一个 Set 上使用 FetchType.LAZY 时会出现 LazyInitializationException,而在另一 Set 上则不会?

java - ThreadPoolExecutor - ArrayBlockingQueue ... 在从队列中删除元素之前等待

android - Google Play 应用内结算版本 3 是否支持退款?

java - 以最小的延迟将视频设备流式传输到 Windows

android - 如何获取 Java API 源代码?

javascript - JQWidgets - Jqxgrid "no data to display",JSON 解析错误

Java: "[B@1ef9157"背后的语法和含义?二进制/地址?

java - 为什么这个字符口导致我的扫描仪失败?

iphone - JSONKit 是否支持 ARC,或者是否有支持 ARC 的 fork?