2017-04-06 53 views
0

我在Android中創建了一個「搜索」框。當我嘗試搜索任何內容時,它不會在列表中顯示更新的值。值將進入列表,但搜索相關值不會更改。這裏是我的快照:在listView中創建SearchBox

this is my search box Image

如果我輸入「AB」它的正常工作,但是當我把「S」,它顯示這樣的第一ListView項:

Image 2

這裏是我的片段課堂,我使用addTextChangeListener

etSearchUser.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      if (i2<i1){ 
       adapter.resetData(); 
      } 
      adapter.getFilter().filter(charSequence); 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 

這裏是我的適配器類別:

public class RemoveUserAdapter extends BaseAdapter implements Filterable { 
private ArrayList<UserModel> listcontent; 
private ArrayList<UserModel> searchList; 
Context context; 
private Filter planetFilter; 
UserModel content, content1; 
LayoutInflater inflater; 

public RemoveUserAdapter(Context context, ArrayList listContent) { 
    this.context = context; 
    this.listcontent = listContent; 
    this.searchList = listContent; 
    inflater = LayoutInflater.from(context); 
} 

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

@Override 
public Object getItem(int i) { 

    return listcontent.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return listcontent.get(i).hashCode(); 
} 


class ViewHolder { 
    private TextView tvEmail, tvUserId; 
    private CheckBox checkBox; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    final ViewHolder viewHolder, viewHolder1; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.remove_user_adapter, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.tvEmail = (TextView) view.findViewById(R.id.tvEmailUser); 
     viewHolder.tvUserId = (TextView) view.findViewById(R.id.tvUserGroup); 
     viewHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox); 
     viewHolder.checkBox.setVisibility(View.INVISIBLE); 
     view.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 


    content = (UserModel) listcontent.get(i); 
    content = (UserModel) searchList.get(i); 
    //Log.i("@@@",content.getEmail()+" email"); 
    viewHolder.tvEmail.setText(content.getEmail()); 
    viewHolder.tvUserId.setText(content.getUsergroup()); 
    return view; 
} 

public void resetData() { 
    listcontent = searchList; 
} 

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

     @Override 
     protected void publishResults(CharSequence charSequence, FilterResults result) { 
      listcontent = (ArrayList<UserModel>) result.values; 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      ArrayList<UserModel> FilteredArrList = new ArrayList<UserModel>(); 
      if (searchList == null) { 
       searchList = new ArrayList<UserModel>(listcontent); 
      } 
      if (constraint == null || constraint.length() == 0) { 

       // set the Original result to return 
       results.count = searchList.size(); 
       results.values = searchList; 
      } else { 
       constraint = constraint.toString().toLowerCase(); 
       for (int i = 0; i < searchList.size(); i++) { 
        content = (UserModel) searchList.get(i); 
        String data = content.getEmail(); 
        String user = content.getUserId(); 
        if (data.toLowerCase().startsWith(constraint.toString())) { 
         FilteredArrList.add(new UserModel(data, user)); 
        } 
       } 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 
      return results; 
     } 

    }; 
    return filter; 
} 

}

對於搜索我使用的是簡單的EditText。

還有一件事是它從Gmail的第一個字母開始搜索。 我想隨機搜索。

例如:[email protected]是否存在,如果我在搜索框「gmail」中輸入它應該顯示結果。

這裏是我的usermodel類:

public class UserModel { 
private String usergroup; 
private String name; 
private String email; 
private String phone; 
private String password; 
private String userId; 

public UserModel(String email, String userGroup) { 
    super(); 
    this.email = email; 
    this.usergroup = userGroup; 
} 
public UserModel(){} 

public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getUsergroup() { 
    return usergroup; 
} 

public void setUsergroup(String usergroup) { 
    this.usergroup = usergroup; 
} 

public String getPhone() { 
    return phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

+0

取代你data.toLowerCase()startsWith(constraint.toString())與data.toLowerCase()包含( constraint.toString()) –

回答

1

getCount必須返回過濾列表可憑此原始列表計數。 有關更多信息,請參閱本要點: https://gist.github.com/fjfish/3024308

我更新代碼:。

public class RemoveUserAdapter extends BaseAdapter implements Filterable { 
private ArrayList<UserModel> listcontent; 
private ArrayList<UserModel> searchList; 
Context context; 
private Filter planetFilter; 
UserModel content, content1; 
LayoutInflater inflater; 

public RemoveUserAdapter(Context context, ArrayList listContent) { 
    this.context = context; 
    this.listcontent = listContent; 
    this.searchList = listContent; 
    inflater = LayoutInflater.from(context); 
} 

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

@Override 
public Object getItem(int i) { 

    return searchList.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return searchList.get(i).hashCode(); 
} 


class ViewHolder { 
    private TextView tvEmail, tvUserId; 
    private CheckBox checkBox; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    final ViewHolder viewHolder, viewHolder1; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.remove_user_adapter, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.tvEmail = (TextView) view.findViewById(R.id.tvEmailUser); 
     viewHolder.tvUserId = (TextView) view.findViewById(R.id.tvUserGroup); 
     viewHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox); 
     viewHolder.checkBox.setVisibility(View.INVISIBLE); 
     view.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 


    content = (UserModel) getItem(i); 
    viewHolder.tvEmail.setText(content.getEmail()); 
    viewHolder.tvUserId.setText(content.getUsergroup()); 
    return view; 
} 

public void resetData() { 
    searchList=listcontent; 
} 

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

     @Override 
     protected void publishResults(CharSequence charSequence, FilterResults result) { 
      searchList = (ArrayList<UserModel>) result.values; 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      ArrayList<UserModel> FilteredArrList = new ArrayList<UserModel>(); 

      if (constraint == null || constraint.length() == 0) { 

       // set the Original result to return 
       results.count = listcontent.size(); 
       results.values = listcontent; 
      } else { 
       constraint = constraint.toString().toLowerCase(); 
       for (int i = 0; i < listcontent.size(); i++) { 
        content = (UserModel) listcontent.get(i); 
        String data = content.getEmail(); 
        String user = content.getUserId(); 
        if (data.toLowerCase().startsWith(constraint.toString())) { 
         FilteredArrList.add(content); 
        } 
       } 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 
      return results; 
     } 

    }; 
    return filter; 
} 
+0

謝謝你@ramin eftekhri – Abhay

+0

你保存了我的時間 – Abhay

+0

@Abhay請接受答案。 –