2017-09-15 5 views
0

こんにちは私は短いリストの中で結果をフィルタリングするsearchviewを持っています。私は現在、表示する必要があるものを読み込むために、次のアクティビティに渡すために整数を使用します。しかし、あなたが検索すると、あなたが検索したアイテムは最初のアイテムとなる位置0になります。だから私はこれのためのユニークなIDシステムをセットアップするか、これを呼び出す方法がありますか?SearchView with ListViewはアイテムの位置を変更し、他のアクティビティの正確なアイテム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; 
} 
+0

itemIdの代わりにオブジェクトを渡すと、getItemId()はitemの位置を返します。 'onItemClick'の中の' clinicInfoArrayList.get(position) 'のリストからオブジェクトを取得できます。 –

+0

問題は、positionは、SearchViewからテキストがフィルタリングされたときに変更される数値です。したがって、例えばリストビュー項目番号5では、リストビューは検索された項目のみを表示するので、位置値に基づいて項目番号0になります。だからポジションは、いつも間違ったものを与えるので、これの中では役に立たない。 –

+0

診療所の名前が一意の場合は、ループして名前の一致を確認し、オブジェクトを取得します。 –

答えて

0

私は同じ問題を抱えていた、私はそれをこのように固定し、onQueryTextChangeを確認するには、まず私たちは私たちのフィルタリングロジックを実装する必要があり、間違いがある場合、私を修正し、私は、Javaに私kotlinロジックを変換しようとしています実装ロジックで

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; 
     } 
    } 
関連する問題