2014-11-07 3 views
1

ListView를 통해 검색하려고합니다. TextView를 사용하여 코드를 작성한 후, 내가 한 일을 로그 아웃했으나 목록을 필터링하지 않았습니다. 필터링하려고합니다. . 여기 내 코드입니다 :EditText를 사용하여 ListView를 검색합니다.

public class LabDetailActivity extends ActionBarActivity { 

    private LabAdapter labListAdapter; 
    private List<LabItem> labItem; 
    private TextView searchText; 
    private SearchView mSearchView; 
    private ListView list; 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setTitle("Labs"); 

     searchText = (TextView) findViewById(R.id.labText); 

     list = (ListView) findViewById(android.R.id.list); 
     labItem = new ArrayList<LabItem>(); 
     labListAdapter = new LabAdapter(this, labItem); 
     list.setAdapter(labListAdapter); 
     list.setTextFilterEnabled(true); 
     list.setOnItemClickListener(new ListItemClickListener()); 
     searchText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      /*labListAdapter.getFilter().filter(charSequence.toString()); 
      list.setAdapter(labListAdapter);*/ 
     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      int textLength = charSequence.length(); 
      List<LabItem> labItemss = new ArrayList<LabItem>(); 
      for (LabItem ll : labItem){ 
       if(textLength <= ll.getName().length()){ 
        if (ll.getName().toLowerCase().contains(charSequence.toString().toLowerCase())){ 
         labItemss.add(ll); 
        } 
       } 
      } 
      Log.d("SIZE OF SEARCH", String.valueOf(labItemss.size())); 
      labListAdapter = new LabAdapter(LabDetailActivity.this, labItemss); 
      list.setAdapter(labListAdapter); 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      /*Log.d("NEW TAGS", "*** Search value changed: " + editable.toString()); 
      if (editable.toString().length() >= 3) 
       labListAdapter.getFilter().filter(editable.toString());*/ 
      //labListAdapter.getFilter().filter(editable.toString()); 
      //labListAdapter.notifyDataSetChanged(); 
     } 
    }); 
    } 

    private class ListItemClickListener implements ListView.OnItemClickListener{ 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

     } 
    } 

    private void RetrieveData(){ 
     Uri uri2 = Uri.parse("content://" + getString(R.string.LEONE_AUTHORITY) + "/olabs"); 
     Log.d("URL PRINT", uri2.toString()); 
     final Cursor cursor = getContentResolver().query(uri2, null, null, null, "_id"); 
     Log.d("CURSOR DATA:", cursor.toString()); 
     JSONArray array = new JSONArray(); 
     if (cursor != null && cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       JSONObject object = new JSONObject(); 
       try { 
        object.put("lab_number", cursor.getString(cursor.getColumnIndex("lab_case_number"))); 
        object.put("lab_name", cursor.getString(cursor.getColumnIndex("lab_case_name"))); 
        array.put(object); 
        Log.d("ARRAY", String.valueOf(array.length())); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      parseJsonLabs(array); 
      cursor.close(); 
     } 
    } 

    private void parseJsonLabs(JSONArray array){ 

     Log.d("CASESARRAY", array.toString()); 
     try { 
      labItem.clear(); 
      for (int i = 0; i < array.length(); i++) { 
       JSONObject cases = (JSONObject) array.get(i); 
       LabItem items = new LabItem(); 

       items.setName(cases.getString("lab_number")); 
       items.setCase(cases.getString("lab_name")); 
       labItem.add(items); 
      } 
      labListAdapter.notifyDataSetChanged(); 
     } catch (JSONException e) { 
      // TODO: handle exception 
      Log.e("ARRAYTEST", "ERROR:", e); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     RetrieveData(); 
    } 
} 

다음, 어댑터 코드가 여기에있다 어댑터

public class LabAdapter extends BaseAdapter implements Filterable{ 

    private Activity activity; 
    private LayoutInflater inflater; 
    private List<LabItem> labItem; 
    private TextView labName, labCase; 

    public LabAdapter(Activity activity, List<LabItem> labItem){ 
     this.activity = activity; 
     this.labItem = labItem; 
    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if (inflater == null) 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) 
      convertView = inflater.inflate(R.layout.custom_lab_activity_list, null); 

     labName = (TextView) convertView.findViewById(R.id.custom_lab_name); 
     labCase = (TextView) convertView.findViewById(R.id.custom_lab_case); 

     LabItem labs = labItem.get(position); 
     labName.setText(labs.getName()); 
     labCase.setText(labs.getCase()); 
     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence charSequence) { 
       Log.d("SEARCHTEXT2", "**** PERFORM FILTERING for: " + charSequence); 
       charSequence = charSequence.toString().toLowerCase(); 
       FilterResults filts = new FilterResults(); 
       if (charSequence == null || charSequence.length() == 0){ 
        filts.values = labItem; 
        filts.count = labItem.size(); 
       } else { 
        // We perform filtering operation 
        List<LabItem> labrs = new ArrayList<LabItem>(); 
        for (LabItem l : labrs){ 
         if (l.getName().startsWith(charSequence.toString()) || l.getCase().startsWith(charSequence.toString())) 
          labItem.add(l); 
        } 
        filts.values = labItem; 
        filts.count = labItem.size(); 
        //filts.count = labItem.size(); 
       } 
       return filts; 
      } 

      @Override 
      protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 
       // Now we have to inform the adapter about the new list filtered 
       Log.d("SEARCHTEXT1", "**** PUBLISHING RESULTS for: " + charSequence); 
       if (filterResults.count == 0) 
        notifyDataSetInvalidated(); 
       else { 
        labItem = (List<LabItem>) filterResults.values; 
        notifyDataSetChanged(); 
       } 
      } 
     }; 
    } 

    public void notifyDataSetChanged(){ 
     super.notifyDataSetChanged(); 
    } 
} 

그리고 항목 클래스는 여기 항목 클래스

public class LabItem { 

    String labCase, labName; 

    public LabItem() { 

    } 

    public LabItem(String labCase, String labName){ 
     super(); 
     this.labCase = labCase; 
     this.labName = labName; 
    } 

    public String getName(){ 
     return labName; 
    } 

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

    public String getCase(){ 
     return labCase; 
    } 

    public void setCase(String cases){ 
     this.labCase = cases; 
    } 
} 

I 돈이다 ListView를 아주 잘 업데이트하지 않는다면 알 수 없습니다. 내가 입력 할 때 나는 카운트를 보지만 다른 문자를 추가하면. 리스트은 사라질 것입니다. 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+0

여기 내 ANS을 확인합니다 http://stackoverflow.com/questions/26652707/filter-listview-using-edittext/26653091#26653091 –

+0

설정하거나 notifyDataSetChanged()하여 전에 어댑터를 무효화 시도! – MOSO

+0

어디서 어떻게 @MOSO –

답변

1

거의 논리 실수 : 여기

당신의 LabDetailActivity.class에서 다음
public LabAdapter(Activity activity, List<LabItem> labItem){ 
     this.activity = activity; 

     this.labItem = labItem; 
    } 

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

    @Override 
    public LabItem getItem(int position) { //instead of Object make it Labitem 
     return labItem.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if (inflater == null) 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) 
      convertView = inflater.inflate(R.layout.activity_stack, null); 

     labName = (TextView) convertView.findViewById(R.id.textView1); 
     labCase = (TextView) convertView.findViewById(R.id.textView2); 

     LabItem labs = labItem.get(position); 
     labName.setText(labs.getName()); 
     labCase.setText(labs.getCase()); 
     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence charSequence) { 
       Log.d("SEARCHTEXT2", "**** PERFORM FILTERING for: " + charSequence); 
       charSequence = charSequence.toString().toLowerCase(); 
       FilterResults filts = new FilterResults(); 
       if (charSequence == null || charSequence.length() == 0){ 
        filts.values = labItem; 
        filts.count = labItem.size(); 
       } else { 
        // We perform filtering operation 
        List<LabItem> labrs = new ArrayList<LabItem>(); 
        for (LabItem l : labItem){ //you are going to search in labItem that contains the data and not the empty list labrs 
         if (l.getName().startsWith(charSequence.toString()) || l.getCase().startsWith(charSequence.toString())){ 
           Log.e("(l.getName().startsWith(charSequence.toString())","" + charSequence); 
           labrs.add(l); // add to the new list** 
         } 
        } 
        filts.values = labrs; //set values to the new list** 
        filts.count = labrs.size(); 
        //filts.count = labItem.size(); 
       } 
       return filts; 
      } 

      @Override 
      protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 
       // Now we have to inform the adapter about the new list filtered 
       Log.d("SEARCHTEXT1", "**** PUBLISHING RESULTS for: " + charSequence); 
       List<LabItem> filtered = (List<LabItem>) filterResults.values; 

       labItem = filtered; // set the new data as you want with the new set you've received.** 
       notifyDataSetChanged(); 

      } 

     }; 
    } 

public void notifyDataSetInvalidated() 
{ 
    super.notifyDataSetInvalidated(); 
} 

searchText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
       labListAdapter.getFilter().filter(charSequence.toString()); 
       Log.d("NEW TAGS", "*** Search value changed: " + labListAdapter.getCount()); 
       list.invalidate(); 
       labListAdapter.notifyDataSetChanged(); 
       list.setAdapter(labListAdapter); 

      } 

편집으로 변경 내 말에 작업이 코드를 가지고 :

P. 이 코드는 텍스트를 지운 후에도 완벽하지 않습니다. 은 목록을 다시 설정하지 않습니다. 나는 너에게 맡긴다. 희망이 당신이 직면 한 문제를 해결하길 바랍니다. 작동하는지 알려주세요.

+0

도움이되었습니다. 그것은 지금 –

+0

좋은 걸 알고있어. 한 가지 더 전에 필터 코드를 beforeTextChanged 대신 onTextChanged로 이동하고 인터페이스를 사용하여 데이터를 어댑터로 전달하고 검색 기능이 제대로 작동하는지 확인하십시오. 이것은 내 메모에 대한 답변입니다. :) – MOSO

관련 문제