2016-04-20 8 views
0

私はカスタムリストビューを使用していますが、検索で予期しない結果が得られます。リスト内の特定の列を検索するのが理想的です。たとえば、請求書番号または連絡先番号、またはその人の名前。 以下は私のコードです。アンドロイドでカスタムリストビューを検索していますか?

public void showJson(String json) { 
     final Context billsctx = getActivity(); 
     ParseBills pb = new ParseBills(json); 
     pb.parseJSON(); 

     bl = new BillsCustomList((Activity) billsctx, ParseBills.doc_no, ParseBills.date, ParseBills.cust_name, ParseBills.cust_number, ParseBills.item_count, ParseBills.total_wt, 
       ParseBills.total,ParseBills.balance, ParseBills.bill_type); 


     all_listView.setAdapter(bl); 




     inputSearch.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 


        bl.getFilter().filter(s); 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

       if (s.length()==0) 
       { 
        refreshFragment(); 
       } 

      } 
     }); 

}

これは私のアダプターのコードです。

public class BillsCustomList extends ArrayAdapter<String> 
{ 
    private String[] doc_no; 
    private String[]date; 
    private String[] cust_name; 
    private String[] cust_number; 
    private String[] item_count; 
    private String[]total_wt; 
    private String[]total; 
    private String[]balance; 
    private String[]bill_type; 

    private Activity context; 

    public BillsCustomList(Activity context, String[] doc_no, String[] date, String[] cust_name,String[] cust_number,String[] item_count,String[] total_wt,String[] total,String[] balance,String[] bill_type) 
    { 
     super(context, R.layout.bills_list_view, doc_no); 
     this.context =context; 
     this.doc_no=doc_no; 
     this.date = date; 
     this.cust_name = cust_name; 
     this.cust_number = cust_number; 
     this.item_count= item_count; 
     this.total_wt = total_wt; 
     this.total = total; 
     this.balance = balance; 
     this.bill_type = bill_type; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View listViewItem = inflater.inflate(R.layout.bills_list_view, null, true); 
     TextView textViewDocno = (TextView) listViewItem.findViewById(R.id.textViewInvNo); 
     TextView textViewDt = (TextView) listViewItem.findViewById(R.id.textViewDt); 
     TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName); 
     TextView textViewNumber = (TextView) listViewItem.findViewById(R.id.textViewNumber); 
     TextView textViewCount = (TextView) listViewItem.findViewById(R.id.textViewCount); 
     TextView textViewTotwt = (TextView) listViewItem.findViewById(R.id.textViewTotwt); 
     TextView textViewTot = (TextView) listViewItem.findViewById(R.id.textViewTot); 
     TextView textViewBal = (TextView) listViewItem.findViewById(R.id.textViewBalanace); 
     TextView textViewBt = (TextView) listViewItem.findViewById(R.id.textViewBt); 

     textViewDocno.setText(doc_no[position]); 
     textViewDt.setText(date[position]); 
     textViewName.setText(cust_name[position]); 
     textViewNumber.setText(cust_number[position]); 
     textViewCount.setText(item_count[position]); 
     textViewTotwt.setText(total_wt[position]); 
     textViewTot.setText(total[position]); 
     textViewBal.setText(balance[position]); 
     textViewBt.setText(bill_type[position]); 

     return listViewItem; 
    } 
} 

どうすれば実現できますか?どんな提案や助けも感謝します。ありがとう。リストビュークラスで

+0

BaseAdapter(ArrayAdapterではなく)を拡張し、独自のフィルタ(getFilter()をオーバーライド)を実装し、検索に含める列の値と比較します。 – Luksprog

+0

このチュートリアルはあなたに役立ちますhttp://www.androidbegin.com/tutorial/android-search-filter-listview-images-and-texts-tutorial/ –

+0

@Luksprog私はプログラミングに新しいです。君は。 – AndroidNewBee

答えて

3

:AdapterClassで

SearchView mSearch; 
mSearch.setOnQueryTextListener(new OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String query) { 

       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       mAdapter.filter(newText); 
       return false; 
      } 

     }); 

private List<ModelClass > mArrayList= new ArrayList<ModelClass >(); 
private ArrayList<ModelClass > arraylist; 

    public void filter(String targetText) { 

      targetText= targetText.toLowerCase(Locale.getDefault()); 
      mArrayList.clear(); 

      if (targetText.length() == 0) { 
       mArrayList.addAll(arraylist); 
      } else { 
       for (ModelClass mModel: arraylist) { 
         if (mModel.getInvoiceNum() 
        .toLowerCase(Locale.getDefault()).startsWith(targetText)) { 
         mArrayList.add(mModel); 
        } 
       } 
      } 
      notifyDataSetChanged(); 
     } 
+0

ここにModelClassとは何ですか? – AndroidNewBee

+0

ここで何をしようとしているのか正確に指定できますか? –

+0

BillObjectはモデルクラスです – user3068659

-1

まず、私はあなたがそれらを含めるオブジェクトを使用することができますすることができ、あなたのデータ型を変更する必要があると思う、とのtoStringをオーバーライドします()メソッドでは、このメソッドはあなたのフィルタ値です:

public class BillObject { 
    public String doc_no; 
    public String date; 
    public String cust_name; 
    public String cust_number; 
    public String item_count; 
    public String total_wt; 
    public String balance; 
    public String bill_type; 

    @Override 
    public String toString() { 
     // if you want to search by name 
     return cust_name; 
    } 
} 

次に、あなたのアダプタで、データソースとして一覧<BillObject>を使用して、このように、各ビューを作成する必要はありません。

public class BillsCustomList extends ArrayAdapter<String> 
{ 
    private List<BillObject> dataList; 
    private Activity context; 

    public BillsCustomList(Activity context, List<BillObject> dataList) 
    { 
     super(context, R.layout.bills_list_view, doc_no); 
     this.context =context; 
     this.dataList = dataList; 

    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     if(convertView == null) 
     { 
      convertView= inflater.inflate(R.layout.bills_list_view, null, true); 
     } 
     // find view by id 
     ...code 

     // get data from dataList by position 
     BillObject billObject = dataList.get(position); 
     textViewDocno.setText(billObject.doc_no); 
     textViewDt.setText(billObject.date); 
     // like this do more 

     return listViewItem; 
    } 

} 

最後に、afterTextChanged()にアダプタのフィルタを使用しています。 ルールとして検索する場合は、dataListをループし、searchKeyでデータを取得することができます。

関連する問題