【问题标题】:SearchView with ListView changes item positions, need exact item IDs for other activity带有 ListView 的 SearchView 更改项目位置,需要其他活动的确切项目 ID
【发布时间】:2017-09-15 23:47:13
【问题描述】:

您好,我有一个搜索视图来过滤短列表中的结果。我目前使用一个整数传递给下一个活动来加载需要显示的内容。但是,如果您搜索,您搜索的项目现在位于位置 0,这就是第一个项目。那么我该如何为此设置一个唯一的 ID 系统,或者我可以为此调用一种方法吗?

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_clinics);
    listView = (ListView) findViewById(R.id.listView);
    final ArrayList<String> clinicInfoArrayList = new ArrayList<String>();
    clinicInfoArrayList.add("Phoenix Urgent Care \n 3931 E Camelback Rd, Phoenix, AZ 85018");
    clinicInfoArrayList.add("Pain Stop North Phoenix Clinic \n 3329 East Bell Road, Suite A2-A5, Phoenix, AZ 85032");
    clinicInfoArrayList.add("The Little Clinic \n 2727 W Bell Rd, Phoenix, AZ 85053");
    clinicInfoArrayList.add("Native Health \n Building C, 4041 N Central Ave, Phoenix, AZ 85012");
    clinicInfoArrayList.add("Allied Clinic, PLLC \n 1147 E Glendale Ave, Phoenix, AZ 85020");
    clinicInfoArrayList.add("Neighborhood Clinic \n 1929 W Fillmore St, Phoenix, AZ 85009");
    clinicInfoArrayList.add("MinuteClinic \n 4742 E Indian School Rd, Phoenix, AZ 85018");


    mSearchView = (SearchView) findViewById(R.id.menu_search);


    listView.setTextFilterEnabled(true);

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            clinicInfoArrayList);

    listView.setAdapter(arrayAdapter);


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View v, int position,
                                long arg3) {



            Intent intent = new Intent(SearchClinics.this,ClinicInfoView.class);


            int something = (int)arrayAdapter.getItemId(position);



         intent.putExtra("Another", something);
        startActivity(intent);
        }
    });


    }


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

    SearchManager searchManager = (SearchManager)
            getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
   mSearchView = (SearchView) searchMenuItem.getActionView();

    mSearchView.setSearchableInfo(searchManager.
            getSearchableInfo(getComponentName()));


    mSearchView.setIconifiedByDefault(false);
    mSearchView.setOnQueryTextListener(this);
    mSearchView.setSubmitButtonEnabled(true);
    mSearchView.setQueryHint("Search Here");
    return true;

}


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

 @Override
 public boolean onQueryTextSubmit(String query) {
    return true;
 }

【问题讨论】:

  • 传递你的对象而不是 itemId,我猜 getItemId() 只是返回项目的位置。您可以从列表中获取对象,clinicInfoArrayList.get(position)onItemClick
  • 问题是,位置是一个数字,当从 SearchView 中过滤文本时会发生变化。因此,例如,在列表视图中,如果根据位置值搜索的项目编号为 5,则现在是项目编号 0,因为列表视图仅显示搜索到的项目。所以位置对这一切都没有帮助,因为它总是会给出错误的。
  • 如果诊所的名字是唯一的,循环,检查名字是否匹配,然后你就得到了这个对象。
  • 或为您的案例创建自定义适配器
  • arg3 是该项目的 ID

标签: android listview searchview


【解决方案1】:

我也遇到了同样的问题,我是这样解决的

    import android.app.SearchManager;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SearchView;

    import java.util.ArrayList;

    /**
     * Created by dr_success on 9/16/2017.
     */

    public class test  extends AppCompatActivity{

        //filtered list here
        final ArrayList<String> filteredList = new ArrayList<String>();
        final ArrayList<String> clinicInfoArrayList = new ArrayList<String>();

        ListView listView;

        SearchView mSearchView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_search_clinics);
            listView = (ListView) findViewById(R.id.listView);

            clinicInfoArrayList.add("Phoenix Urgent Care \n 3931 E Camelback Rd, Phoenix, AZ 85018");
            clinicInfoArrayList.add("Pain Stop North Phoenix Clinic \n 3329 East Bell Road, Suite A2-A5, Phoenix, AZ 85032");
            clinicInfoArrayList.add("The Little Clinic \n 2727 W Bell Rd, Phoenix, AZ 85053");
            clinicInfoArrayList.add("Native Health \n Building C, 4041 N Central Ave, Phoenix, AZ 85012");
            clinicInfoArrayList.add("Allied Clinic, PLLC \n 1147 E Glendale Ave, Phoenix, AZ 85020");
            clinicInfoArrayList.add("Neighborhood Clinic \n 1929 W Fillmore St, Phoenix, AZ 85009");
            clinicInfoArrayList.add("MinuteClinic \n 4742 E Indian School Rd, Phoenix, AZ 85018");


            mSearchView = (SearchView) findViewById(R.id.menu_search);


            listView.setTextFilterEnabled(true);

            final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
                    this,
                    android.R.layout.simple_list_item_1,
                    clinicInfoArrayList);

            listView.setAdapter(arrayAdapter);


            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapter, View v, int position,
                                        long arg3) {



                    Intent intent = new Intent(SearchClinics.this,ClinicInfoView.class);


                   int itemId = (int)arrayAdapter.getItemId(position);

                    String somethingText;

                    //if the filtered list is not empty, get the item from there
                    if(!filteredList.isEmpty()){
                        somethingText = filteredList.get(itemId);
                    }else{
                         somethingText = clinicInfoArrayList.get(itemId);
                    }

                    intent.putExtra("Another", somethingText);
                    startActivity(intent);
                }
            });


        }


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

            SearchManager searchManager = (SearchManager)
                    getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
            mSearchView = (SearchView) searchMenuItem.getActionView();

            mSearchView.setSearchableInfo(searchManager.
                    getSearchableInfo(getComponentName()));


            mSearchView.setIconifiedByDefault(false);
            mSearchView.setOnQueryTextListener(this);
            mSearchView.setSubmitButtonEnabled(true);
            mSearchView.setQueryHint("Search Here");
            return true;

        }


        @Override
        public boolean onQueryTextChange(String newText) {

                //clear filtered list, so to avoid problems
                filteredList.clear()

            if (TextUtils.isEmpty(newText)) {
   ;

                return false;
            }

            for(int i=0;i <= clinicInfoArrayList.size();i++){

                String clinicInfoText = clinicInfoArrayList.get(i);

                if(clinicInfoText.contains(clinicInfoText)){
                    filteredList.add(clinicInfoText);
                }


                final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
                        this,
                        android.R.layout.simple_list_item_1,
                        clinicInfoArrayList);

                //reset the adapter
                listView.setAdapter(arrayAdapter);
                listView.notify();
            }



            return true
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }
    }

【讨论】:

  • 这条线对我有用 arrayAdapter.getItemId(position)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
相关资源
最近更新 更多