2017-05-11 11 views
0

リストビューでフィルタ(検索)を設定し、アダプタクラスに対して "extends BaseAdapter implements filpleable"を使用します。カスタムベースアダプタが動作しないフィルタ

この私のコード:

public class UserList extends BaseAdapter implements Filterable { 
    private Context context; 
    private List<Users> user; 

    public UserList(Context context, List<Users> user) { 
     this.context = context; 
     this.user = user; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return user.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return user.get(position).getId(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = View.inflate(context, R.layout.listview_item, null); 
     ImageView imgUser = (ImageView) view.findViewById(R.id.list_image); 
     TextView txtName = (TextView) view.findViewById(R.id.list_item_title); 
     TextView txtDesc = (TextView) view.findViewById(R.id.list_item_short); 
     TextView txtSex = (TextView) view.findViewById(R.id.list_item_sex); 
     TextView txtAge = (TextView) view.findViewById(R.id.list_item_age); 
     //get byte[] from db , resize and convert to bitmap 
     Bitmap bmp = BitmapFactory.decodeByteArray(user.get(position).getPic(), 0, user.get(position).getPic().length); 
     imgUser.setImageBitmap(getResizedBitmap(bmp, 300, 150)); 
     txtName.setText(user.get(position).getUserName()); 
     txtDesc.setText(user.get(position).getUserDesc()); 
     txtSex.setText(user.get(position).getGender()); 
     txtAge.setText(user.get(position).getAge() + " ساله "); 
     return view; 
    } 

と、この私のフィルタ方法: enter image description here

+0

user =(ArrayList )results.values;問題はここに参照を変更することです – Pavan

+0

私は何をしているのか分からない! –

答えて

1

private Filter filterResult = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      ArrayList<Users> tempList = new ArrayList<>(); 
      if (constraint != null && user != null) { 
       int length = user.size(); 
       int i = 0; 
       while (i < length) { 
        Users item = user.get(i); 
        tempList.add(item); 
        i++; 
       } 
       filterResults.values = tempList; 
       filterResults.count = tempList.size(); 
      } 
      return filterResults; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      user = (ArrayList<Users>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 

    @Override 
    public Filter getFilter() { 
     return filterResult; 
    } 

けど...フィルタリストビューにテキストを入力し、この画像を見たときに何も起こりません

コードに間違いがあります。

  1. フィルタがないオリジナルの配列を保持する必要があります。 あなたがあなたのコード内でフィルタを実行しませんでした。この

    private List<Users> original; 
    private List<Users> user; 
    public UserList(Context context, List<Users> user) { 
        this.context = context; 
        this.user = user; 
        this.original = user; 
    } 
    
  2. のようにコードを変更する必要があります。あなたは、私が

    宣言一時リストに従ってくださいするアダプタが私の解決策に従って、あなたのデータへの参照を取得することはできませんので、あなたのデータセットの参照がフィルタに変化している。この場合、あなたのコード

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
        FilterResults filterResults = new FilterResults(); 
        ArrayList<Users> tempList = new ArrayList<>(); 
        if (original != null) { 
         if (TextUtil.isEmpty(constraint)){ 
          tempList = original; 
         } else { 
          int length = user.size(); 
          int i = 0; 
          while (i < length) { 
           User item = original.get(i); 
           // check item again your constraint see example below 
           if (item.name.contain(constraint)) 
            tempList.add(item); 
           i++; 
          } 
         } 
        } 
        filterResults.values = tempList; 
        filterResults.count = tempList.size(); 
        return filterResults; 
    } 
    
1

修正する必要がありますアダプタで参照の問題を回避し、アダプタのコンストラクタで、それを呼び出すためにループして

private List<Users> tempuser; 

は今、これを埋めるのすべてのデータが含まれている

private void fillData() 
    { 
    // initialize tempuserhere 
tempuser=new List<Users>() ; //check as per your model 
     for(Users obj:user) 
     { 
      tempuser.add(obj); 
     } 

    } 
コンストラクタで

フィルタ処理クラスで今
public UserList(Context context, List<Users> user) { 
     this.context = context; 
     this.user = user; 
    fillData(); 
    } 

@Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      if (constraint != null && tempuser != null) { 

       boolean fillAll=false; 
       user.clear(); 
       if(constraint.toString().trim().length==0) 
        fillAll=true; 
       for(Users objUser:tempuser) 
       { 
        if(fillAll || constraint.toString().trim().toLowerCase().contains(objUser.value.toLowerCase()))///the objUser value replaced with your compare string 
        { 
        user.add(objUser); 
        } 
       } 
       filterResults.values = user; 
       filterResults.count = user.size(); 
      } 
      return filterResults; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      user = (ArrayList<Users>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

いかなる問題は私が知っているならば、あなたはこれを試すことができ、また すべてのユーザーがstandaradのアプローチは、私に教えて知っていれば

+0

null参照を伴うメソッドのクラッシュ:private void fillData() { // tempuserhereを初期化する for(Users obj:user) { tempuser.add(obj); } } –

+0

あなたはそれを初期化する必要がありますtempuser = new List Pavan

関連する問題