2014-11-06 19 views
9

Tôi rất mới sử dụng SearchView. Tôi cần một chức năng mà tôi có một số ActionBar mà tôi có Search. Khi tôi nhấp vào Tìm kiếm, Đề xuất sẽ được hiển thị trong một danh sách Danh sách bên dưới trường Tìm kiếm.Bộ lọc tìm kiếm và đặt đề xuất

Những gì tôi đã làm cho đến nay: tìm kiếm gia tăng trong menu.xml và viết mã trong onCreateOptionsMenu() nơi tôi khởi tạo SearchView và setSuggestionsAdapter cũng thực hiện setOnQueryTextListener.

Kết quả: Tôi nhập ứng dụng, nhấp vào biểu tượng tìm kiếm, biểu tượng hiển thị các đề xuất. Tôi gõ một lá thư nó sắp xếp ra những cái phù hợp. Tôi gõ chữ thứ 2 nó cho thấy không có gợi ý. Ngoài ra, tôi đóng chế độ xem tìm kiếm và mở lại lần nữa, Bàn phím được mở, nhưng các Đề xuất trong Danh sách không được hiển thị.

Tôi cần gì: Lọc theo ký tự do người dùng nhập. Ngay cả khi nó có nhiều hơn một ký tự. Luôn hiển thị đề xuất mặc định với tất cả các mục trong danh sách hoặc các đề xuất được sắp xếp khi người dùng nhập.

Tôi đã thấy trong lớp SearchView của Android, họ đang đặt văn bản thành trống và cũng loại bỏ Đề xuất. Nhưng tôi không muốn điều này.

Tôi bị kẹt ở đây và không biết cách tiếp tục. Làm ơn giúp tôi. Đây là Mã Adaptor của tôi:

public class ExampleAdapter extends CursorAdapter implements Filterable { 

    private ArrayList<String> items; 
    private ArrayList<String> orig; 

    public ExampleAdapter(Context context, Cursor cursor, 
      ArrayList<String> items) { 
     super(context, cursor, false); 
     this.items = new ArrayList<String>(); 
     this.items = items; 
     orig = new ArrayList<String>(); 
     orig.addAll(items); 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       constraint = constraint.toString().toLowerCase(); 
       FilterResults result = new FilterResults(); 

       if (constraint != null 
         && constraint.toString().length() > 0) { 
        List<String> founded = new ArrayList<String>(); 
        for (int i = 0, l = orig.size(); i < l; i++) { 
         if (orig.get(i) 
           .toString() 
           .toLowerCase() 
           .startsWith(
             constraint.toString().toLowerCase())) 
          founded.add(orig.get(i)); 
        } 

        result.values = founded; 
        result.count = founded.size(); 
       } else { 
        synchronized (this) { 
         result.values = orig; 
         result.count = orig.size(); 
        } 

       } 
       return result; 

      } 

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

       items.clear(); 
       items = new ArrayList<String>(); 
       items = (ArrayList<String>) results.values; 
       notifyDataSetChanged(); 

      } 

     }; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.textView.setText(items.get(cursor.getPosition())); 
    } 

    public class ViewHolder { 
     public TextView textView; 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     View v = null; 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     v = inflater.inflate(R.layout.item, parent, false); 
     holder.textView = (TextView) v.findViewById(R.id.text); 

     v.setTag(holder); 
     return v; 

    } 
} 

Mã trong Hoạt động của tôi liên quan đến đơn nơi tôi có SearchView:

private String[] columns = new String[] { "_id", "text" }; 
    private SearchView searchView; 
    private SearchManager manager; 
    private ExampleAdapter aptr; 

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

    manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

} 

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
     setSearchTextColour(searchView); 
     setSearchIcons(searchView); 
     searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" 
       + getResources().getString(R.string.search_store) + "</font>")); 
     searchView.setSearchableInfo(manager 
       .getSearchableInfo(getComponentName())); 
     Object[] temp = new Object[] { 0, "default" }; 
     final MatrixCursor cursor = new MatrixCursor(columns); 
     for (int i = 0; i < alStoreNames.size(); i++) { 
      temp[0] = i; 
      temp[1] = alStoreNames.get(i); 
      cursor.addRow(temp); 
     } 
     aptr = new ExampleAdapter(MainActivity.this, cursor, alStoreNames); 
     searchView.setSuggestionsAdapter(aptr); 

    searchView.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String arg0) { 
      if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String arg0) { 
      return false; 
     } 
    }); 

    searchView.setOnSuggestionListener(new OnSuggestionListener() { 

      @Override 
      public boolean onSuggestionSelect(int arg0) { 
       return false; 
      } 

      @Override 
      public boolean onSuggestionClick(int position) { 
       String suggestion = getSuggestion(position); 
       db.openDatabase(); 
       String studentId = db.getStudentIdFromName(suggestion); 
       String studentImg = db.getStudentImgFromName(suggestion); 
       db.closeDatabase(); 
       Log.e("Sp", " On Click name -> " + aptr.getItem(position).toString() + " : " 
         + aptr.getCursor().getString(0) + " : " + suggestion); 
       Intent i = new Intent(MainActivity.this, 
         ExampleActivity.class); 
       i.putExtra("studentId", studentId); 
       i.putExtra("studentName", suggestion); 
       i.putExtra("studentImg", studentImg); 
       startActivity(i); 
       return true; 
      } 
     }); 

    return true; 
} 

private String getSuggestion(int position) { 
    Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(
      position); 
    String suggest1 = cursor.getString(cursor.getColumnIndex("text")); 
    return suggest1; 
} 

private void setSearchTextColour(SearchView searchView) { 
     Field qTextField; 
     try { 
      qTextField = SearchView.class.getDeclaredField("mQueryTextView"); 
      qTextField.setAccessible(true); 
      SearchAutoComplete searchPlate = (SearchAutoComplete) qTextField 
        .get(searchView); 
      searchPlate.setTextColor(getResources().getColor(R.color.white)); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

private void setSearchIcons(SearchView searchView) { 
    try { 
     Field searchField = SearchView.class 
       .getDeclaredField("mCloseButton"); 
     searchField.setAccessible(true); 
     ImageView closeBtn = (ImageView) searchField.get(searchView); 
     closeBtn.setImageResource(R.drawable.close); 

     Field searchField1 = SearchView.class 
       .getDeclaredField("mSearchButton"); 
     searchField1.setAccessible(true); 
     ImageView searchButton = (ImageView) searchField1.get(searchView); 
     searchButton.setImageResource(R.drawable.ic_action_search); 

    } catch (NoSuchFieldException e) { 
     Log.e("SearchView", e.getMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e("SearchView", e.getMessage(), e); 
    } 
} 
+0

Thay đổi bộ lọc đang – Lokesh

+0

gì thay đổi? không có vấn đề gì với vấn đề lọc .. là với onsuggestionclick – Lavanya

+0

Kiểm tra: http://stackoverflow.com/questions/23422072/searchview-in-listview-having-a-custom-adapter/23422665#23422665 –

Trả lời

2

Dường như với tôi rằng một phần của vấn đề là ở sự vắng mặt của phương pháp GetItem().

Nếu bạn nhìn vào mã nguồn của bộ điều hợp con trỏ, getItem() sẽ lấy dữ liệu từ con trỏ và không lấy từ danh sách đã lọc của bạn, bạn muốn nó lấy dữ liệu từ danh sách được lọc của bạn!

Hãy thử điều này:

@Override 
public Object getItem(int position) { 
    if (position < items.size()) {    
     return items.get(position); 
    } else { 
     return null; 
    } 
} 

tôi quên để thêm, bạn cũng cần phải thay đổi điều này:

private String getSuggestion(int position) { 
    String suggest1 = (String) searchView.getSuggestionsAdapter().getItem(position);  
    return suggest1; 
} 

Và để đóng tất cả mọi thứ, đầu tiên thêm video này vào thực đơn createOptions:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    searchView.setIconifiedByDefault(true); //this line 

    ... 

sau đó thêm mục này vào onSuggestionBấm:

@Override 
public boolean onSuggestionClick(int position) { 
    String suggestion = getSuggestion(position); 
    db.openDatabase(); 
    String studentId = db.getStudentIdFromName(suggestion); 
    String studentImg = db.getStudentImgFromName(suggestion); 
    db.closeDatabase(); 
    Log.e("Sp", " On Click name -> " + aptr.getItem(position).toString() + " : " 
     + aptr.getCursor().getString(0) + " : " + suggestion); 

    searchView.setIconified(true);//this line 


    Intent i = new Intent(MainActivity.this,ExampleActivity.class); 
    i.putExtra("studentId", studentId); 
    i.putExtra("studentName", suggestion); 
    i.putExtra("studentImg", studentImg); 
    startActivity(i); 
    return true; 
} 

Một chút giải thích.Khi bạn gọi setIconified, nó sẽ xóa văn bản tìm kiếm của bạn Xem hoặc thu gọn văn bản, tùy thuộc vào trạng thái mặc định. Những gì chúng tôi đã làm ở đó đã thiết lập trạng thái mặc định thành biểu tượng để khi chúng ta gọi phương thức setIconified nó sẽ xóa văn bản và thu gọn khung nhìn!

2

Xin chào Tôi tìm thấy một số vấn đề với mã của bạn. hãy thử theo cách của tôi. thay publishResults of ExampleAdapter

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

       items.clear(); 
       // items = new ArrayList<String>(); 
       //items = (ArrayList<String>) results.values; 
       items.addAll((ArrayList<String>) results.values); 
       notifyDataSetChanged(); 

      } 

searchView.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String arg0) { 
      if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String arg0) { 
if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
return true; 
      } 
      return false; 
     } 
    }); 
+0

giải quyết danh sách đề xuất vấn đề. Nhưng khi tôi nhấp vào một trong các mục từ danh sách đề xuất được sắp xếp, nó trỏ đến chuỗi cũ ở vị trí đó – Lavanya

+0

làm cho toàn cầu cursoradapter và cố gắng sử dụng adapter.getItem (vị trí); –

+0

Tôi có onSuggestionNhấp vào nơi khi tôi nhấp vào nó cung cấp tên chuỗi được nhấp – Lavanya

0

Cố gắng vượt qua giá trị tìm kiếm để lọc thậm chí là rỗng:

@Override 
public boolean onQueryTextSubmit(String arg0) { 
    aptr.getFilter().filter(arg0.toString()); 
    return true; 
} 

Set danh sách mặc định để thiết bị tiếp hợp nếu tìm kiếm không phù hợp hoặc giá trị tìm kiếm là trống:

@Override 
public Filter getFilter() { 
    return new Filter() { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     constraint = constraint.toString().toLowerCase(); 
     FilterResults result = new FilterResults(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      List<String> founded = new ArrayList<String>(); 
      for (int i = 0, l = orig.size(); i < l; i++) { 
       if (orig.get(i).toString().toLowerCase().startsWith(constraint.toString().toLowerCase())) 
          founded.add(orig.get(i)); 
      } 

      if(founded.size()>0){ 
      result.values = founded; 
      result.count = founded.size(); 
      }else{ 
      result.values = orig; 
      result.count = orig.size(); 
      } 
     } else { 
      result.values = orig; 
      result.count = orig.size(); 
     } 
     return result; 

} 
Các vấn đề liên quan