2012-11-27 47 views
0

我有我的應用程序列表視圖,它看起來像這樣:過濾列表視圖圖像和文本查看使用自定義與adpater

--img-- --ArrayListItems(地名)--- --- TextView-- -

我正在使用搜索視圖的動作欄sherlock使應用程序反向兼容。 我正在使用自定義適配器來擴展基本適配器,並且還實現了可過濾。我真正需要的是,當用戶鍵入搜索欄中的文本時,我應該能夠根據ArrayListItems(名稱)過濾列表視圖。我提到了幾個帖子在stackoverflow,嘗試所有的代碼片段。但仍然無法搜索。當我運行代碼時,搜索欄不做任何事情。

在我的活動我所做的:

public class SearchViewActionBar extends SherlockActivity implements SearchView.OnQueryTextListener 
{ 
    public SearchView mSearchView; 
    private TextView mStatusView; 
    int mSortMode = -1; 


    protected CharSequence[] _options = { "Wild Life", "River", "Hill Station", "Temple", "Bird Sanctuary", "Hill", "Amusement Park"}; 
    protected boolean[] _selections = new boolean[ _options.length ]; 


    private final String[] mStrings = Cheeses.sCheeseStrings; 

    ListView lv1; 

    ItemListBaseAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 

     setContentView(R.layout.activity_main); 


     ArrayList<ItemDetails> image_details = GetSearchResults(); 
     lv1= (ListView) findViewById(R.id.list_view); 

     adapter=new ItemListBaseAdapter(this, image_details); 

     lv1.setAdapter(adapter); 
     lv1.setTextFilterEnabled(true); 


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


     /*lv1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
       Object o = lv1.getItemAtPosition(position); 
       ItemDetails obj_itemDetails = (ItemDetails)o; 
       //Toast.makeText(ListViewImagesActivity.this, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show(); 
      } 
     });*/ 


    } 


    private ArrayList<ItemDetails> GetSearchResults() 
    { 
     ArrayList<ItemDetails> results = new ArrayList<ItemDetails>(); 


     for(int i=0;i<mStrings.length;i++) 
     { 

     ItemDetails item_details = new ItemDetails(); 
     item_details.setName(mStrings[i]); 
     item_details.setItemDescription("200"); 
     results.add(item_details); 
     } 


     return results; 
    } 

    private void setupSearchView() { 
     mSearchView.setIconifiedByDefault(true); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setSubmitButtonEnabled(false); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     super.onCreateOptionsMenu(menu); 

     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.searchview_in_menu, menu); 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     mSearchView = (SearchView) searchItem.getActionView(); 

     setupSearchView(); 

     return true; 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) 
    { 
     if (mSortMode != -1) 
     { 
      //Drawable icon = menu.findItem(mSortMode).getIcon(); 
      //menu.findItem(R.id.action_sort).setIcon(icon); 
     } 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 


    switch (item.getItemId()) { 
     //case R.id.action_search: 
      //finish(); 
      //getSupportActionBar().setDisplayShowHomeEnabled(false); 
      //getSupportActionBar().setDisplayShowTitleEnabled(false); 
      //System.out.println("search pressed"); 
      //break; 
     case R.id.action_edit: 
      System.out.println("category pressed"); 
      showDialog(0); 
      //finish(); 
      break; 
     default: 
      //return super.onOptionsItemSelected(item); 
      break; 
     } 

     /* 
     String c="Category"; 
     if(s.equals(c)) 
     { 
      System.out.println("same"); 
      ; 
     }*/ 

     //Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

    protected Dialog onCreateDialog(int id) 
    { 
     return 
     new AlertDialog.Builder(this) 
      .setTitle("Category") 
      .setMultiChoiceItems(_options, _selections, new DialogSelectionClickHandler()) 
      .setPositiveButton("SAVE", new DialogButtonClickHandler()) 
      .create(); 
    } 


    public class DialogSelectionClickHandler implements DialogInterface.OnMultiChoiceClickListener 
    { 
     public void onClick(DialogInterface dialog, int clicked, boolean selected) 
     { 
      Log.i("ME", _options[ clicked ] + " selected: " + selected); 
     } 
    } 


    public class DialogButtonClickHandler implements DialogInterface.OnClickListener 
    { 
     public void onClick(DialogInterface dialog, int clicked) 
     { 
      switch(clicked) 
      { 
       case DialogInterface.BUTTON_POSITIVE: 
        printSelectedPlanets(); 
        break; 
      } 
     } 
    } 

    protected void printSelectedPlanets() 
    { 
     for(int i = 0; i < _options.length; i++){ 
      Log.i("ME", _options[ i ] + " selected: " + _selections[i]); 
     } 
    } 

    public void onSort(MenuItem item) 
    { 
     mSortMode = item.getItemId(); 
     invalidateOptionsMenu(); 
    } 


    public boolean onQueryTextChange(String newText) 
    { 


     /*ActionBar ab = getSupportActionBar(); 
     ab.setDisplayShowTitleEnabled(false); 
     ab.setDisplayShowHomeEnabled(false);*/ 

     //getSupportActionBar().setDisplayShowHomeEnabled(false); 
     //getSupportActionBar().setDisplayShowTitleEnabled(false); 

     if (TextUtils.isEmpty(newText)) 
     { 
      System.out.println("empty query"); 
      lv1.clearTextFilter(); 
     } 
     else 
     { 
      //System.out.println(newText.toString()); 

      adapter.getFilter().filter(newText); 
      //adapter.getFilter().filter(s); 

      //lv1.setFilterText(newText.toString()); 
     } 
     return true; 
    } 

    public boolean onQueryTextSubmit(String query) 
    { 
     mStatusView.setText("Query = " + query + " : submitted"); 
     return false; 
    } 

    public boolean onClose() 
    { 
     mStatusView.setText("Closed!"); 
     return false; 
    } 

    protected boolean isAlwaysExpanded() 
    { 
     return false; 
    } 
} 

我的適配器類:

public class ItemListBaseAdapter extends BaseAdapter implements Filterable 
{ 
    private static ArrayList<ItemDetails> itemDetailsrrayList,list; 

    private Integer[] imgid = { 
      //R.drawable.p1, 
      R.drawable.bb2, 
      /*R.drawable.p2, 
      R.drawable.bb5, 
      R.drawable.bb6, 
      R.drawable.d1*/ 
      }; 

    private LayoutInflater l_Inflater; 

    public ItemListBaseAdapter(Context context, ArrayList<ItemDetails> results) { 
     itemDetailsrrayList = results; 
     l_Inflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return itemDetailsrrayList.size(); 
    } 

    public Object getItem(int position) { 
     return itemDetailsrrayList.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = l_Inflater.inflate(R.layout.item_details_view, null); 
      holder = new ViewHolder(); 
      holder.txt_itemName = (TextView) convertView.findViewById(R.id.textView1); 
      holder.txt_itemDescription = (TextView) convertView.findViewById(R.id.textView2); 
      //holder.txt_itemPrice = (TextView) convertView.findViewById(R.id.phone); 
      holder.itemImage = (ImageView) convertView.findViewById(R.id.imageView1); 

      convertView.setTag(holder); 
     } else 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.txt_itemName.setText(itemDetailsrrayList.get(position).getName()); 
     //holder.txt_itemDescription.setText(itemDetailsrrayList.get(position).getItemDescription()); 
     holder.txt_itemDescription.setText("200"); 

     //holder.txt_itemPrice.setText(itemDetailsrrayList.get(position).getPrice()); 
     //holder.itemImage.setImageResource(imgid[itemDetailsrrayList.get(position).getImageNumber() - 1]); 

     holder.itemImage.setImageResource(imgid[0]); 

     return convertView; 
    } 

    static class ViewHolder 
    { 
     TextView txt_itemName; 
     TextView txt_itemDescription; 
     //TextView txt_itemPrice; 
     ImageView itemImage; 
    } 

    public Filter getFilter() 
    { 
     Filter filter = new Filter() { 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint,FilterResults results) { 

       list = (ArrayList<ItemDetails>) results.values; // has the filtered values 
       notifyDataSetChanged(); // notifies the data with new filtered values 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
       List<String> FilteredArrList = new ArrayList<String>(); 

       if (list == null) { 
        list = new ArrayList<ItemDetails>(list); // saves the original data in mOriginalValues 
       } 

       /******** 
       * 
       * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values 
       * else does the Filtering and returns FilteredArrList(Filtered) 
       * 
       ********/ 
       if (constraint == null || constraint.length() == 0) { 

        // set the Original result to return 
        results.count = list.size(); 
        results.values = list; 
       } else { 
        constraint = constraint.toString().toLowerCase(); 
        for (int i = 0; i < list.size(); i++) 
        { 
         String data="b"; 
         //= list.getName(i); 
         if (data.toLowerCase().startsWith(constraint.toString())) { 
          FilteredArrList.add(data); 
         } 
        } 
        // set the Filtered result to return 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
       return results; 
      } 
     }; 
     return filter; 
    } 

} 

回答

1

我在這裏發佈了一個答案:https://stackoverflow.com/a/12363961/450534這是基於我幾天前回到這裏的問題:Filtering a ListView with Baseadapter filters text not images

我在這個問題上面臨的問題是,文本將被圖像過濾不匹配。發佈的答案可以解決這個問題。答案中也提到了這個解決方案,它適用於GridView,但也適用於ListView

這是一個強大的冗長答案,所以我只是簡單地鏈接而不是重新發布在這裏。它有整個解決方案順便說一句,並應該幫助你就好。

2

你有一個TextWatcher添加到您的搜索查看類似如下:

mSearchView.addTextChangedListener(new TextWatcher() { 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    adapter.getFilter().filter(s); 
}} 

注意:

Filter使用您的ItemDetails類的toString方法。你必須重寫toString進行過濾。

+0

對不起。我不明白笏你說...?請你說清楚。? –

+0

我無法做到這一點,因爲我已經使用從操作欄sherlock搜索視圖,並限制我不使用addTextChangedListener。 –

相關問題