2012-03-13 88 views
0

我有我的主要自定義列表活動類,它具有ArrayAdapter中的自定義擴展類的實例對象。我的Textwatcher正在拾取字符並在適配器上搜索得很好,但是當我按下「Backspace」或「DEL」按鈕刪除我的字符時,我的列表視圖變空了而不是顯示所有記錄。Android - 自定義列表視圖篩選器返回null

這是我的活動。

adapter = new ProjectArrayAdapter(this, titles, statuses, ids, starteds); 

       eTprojectsearch = (EditText) findViewById(R.id.txtprojectsearch); 
       eTprojectsearch.addTextChangedListener(Listener__SearchProject); 

       eTprojectsearch.setOnEditorActionListener(new OnEditorActionListener() { 

        @Override 
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
         // TODO Auto-generated method stub 
         if(actionId == KeyEvent.KEYCODE_DEL) { 
          if(eTprojectsearch.getText().toString().trim().equals("")) { 
           setListAdapter(adapter); 
          } 
         } 
         return false; 
        } 
       });    
       setListAdapter(adapter); 

Listener__SearchProject是功能..

private TextWatcher Listener__SearchProject = new TextWatcher() { 

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

      adapter.getFilter().filter(s); 
      adapter.notifyDataSetChanged(); 
      //notifyAll(); 

      /* 
      * if(s.length() == -1) { 
       setListAdapter(adapter); 
      } else { 
       adapter.getFilter().filter(s,new Filter.FilterListener() { 

        public void onFilterComplete(int count) { 
         Log.i("ADAPTER:COMPLETE COUNT",String.valueOf(count)); 
         adapter.setNotifyOnChange(true); 
        } 
       }); 
      } 
      */ 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }; 

這裏是我的適配器,帶我Viewholder完整的類等

package com.plumleaf.leaf; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import android.app.Activity; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.TextView; 

/** 
* 
* @author  Hamza 
* @since  PlumLeaf.2012 
* @category Custom Array Adapters 
* 
*/ 
public class ProjectArrayAdapter extends ArrayAdapter<String> implements Filterable { 

    private final Activity context; 
    private final List<String> titles; 
    private final List<String> statuses; 
    private final List<String> ids; 
    private final List<String> starteds; 
    ProjectFilter filter; 
    public final Object mLock = new Object(); 

    ArrayList<String> items; 
    ArrayList<String> filteredItems; 

    static class PViewHolder { 
     public TextView title; 
     public TextView status; 
     public TextView id; 
     public TextView started; 
    } 

    public ProjectArrayAdapter(Activity context, List<String> titles,List<String> statuses,List<String> ids,List<String> starteds) { 
     super(context, R.layout.projectlist, titles); 
     this.context = context; 
     this.titles  = titles; 
     this.statuses = statuses; 
     this.ids  = ids; 
     this.starteds = starteds; 
     this.items = (ArrayList<String>)titles; 
     this.filteredItems = this.items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = convertView; 
     if (rowView == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.projectlist, null); 
      PViewHolder viewHolder = new PViewHolder(); 
      viewHolder.title  = (TextView) rowView.findViewById(R.id.projecttitle); 
      viewHolder.status  = (TextView) rowView.findViewById(R.id.projectstatus); 
      viewHolder.id   = (TextView) rowView.findViewById(R.id.projectid); 
      viewHolder.started  = (TextView) rowView.findViewById(R.id.projectstarted); 
      rowView.setTag(viewHolder); 
     } 

     PViewHolder holder = (PViewHolder) rowView.getTag(); 
     String title  = titles.get(position); 
     String status  = statuses.get(position); 
     String id   = ids.get(position); 
     String started  = starteds.get(position); 
     holder.title.setText((title.length() > 17 ? title.substring(0, 17)+"..." : title)); 
     holder.status.setText(status); 
     holder.id.setText(id); 
     holder.started.setText(started); 
     return rowView; 

    } 

    public Filter getFilter() { 
     if (filter == null){ 
      filter = new ProjectFilter(); 
     } 
     return filter; 
    } 

    private class ProjectFilter extends Filter {   

     @SuppressWarnings({ "rawtypes", "unchecked" }) 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) {    
      FilterResults results = new FilterResults(); 

      if (prefix == null || prefix.length() == 0) { 
       synchronized (mLock) { 
        results.values = items; 
        results.count = items.size(); 
       } 
      } else { 
       synchronized(mLock) { 
        String prefixString = prefix.toString().toLowerCase(); 
        final ArrayList filteredItems = new ArrayList(); 
        final ArrayList localItems = new ArrayList(); 
        localItems.addAll(items); 
        final int count = localItems.size(); 
        for (int i = 0; i < count; i++) { 
         final String cString = String.valueOf(localItems.get(i)); 
         if (cString.contains(prefixString.toLowerCase())) { 
          filteredItems.add(cString); 
         }       
        } 

        results.values = filteredItems; 
        results.count = filteredItems.size(); 
       }//end synchronized 
      } 

      return results; 
     } 

     protected void publishResults(CharSequence prefix, FilterResults results) { 
      synchronized(mLock) { 
       @SuppressWarnings("unchecked") 
       final ArrayList<String> localItems = (ArrayList<String>) results.values; 
       notifyDataSetChanged(); 
       clear(); 
       for (Iterator<String> iterator = localItems.iterator(); iterator 
         .hasNext();) { 
        String gi = (String) iterator.next(); 
        add(gi); 
       } 
      }//end synchronized 
     } 
    } 
} 

請點我在哪裏我米誤..

回答

0

ProjectArrayAdapterArrayList<String> itemsArrayList<String> filteredItemsArrayAdapterList<T> mObjects;指同一ArrayList實例。 (呼叫clear()方法ArrayAdapter,然後檢查items.size()它必須是零。)

  1. onTextChanged

  2. 刪除此行adapter.notifyDataSetChanged();this.items = new ArrayList<String>(titles);

  3. publishResults()方法替換this.items = (ArrayList<String>)titles;(在構造函數)應看起來像......

    synchronized(mLock) { 
         final ArrayList<String> localItems = (ArrayList<String>) results.values; 
         clear(); 
         for (String gi : localItems) { 
          add(gi); 
         } 
         notifyDataSetChanged(); 
        } 
    

您確定需要ArrayList<String> filteredItems;嗎?ProjectArrayAdapter?除非有必要,否則請將其除去。

+0

它的作品人!非常感謝。我只花了我2天的時間。 。非常好。先生,再次感謝! 但是,另一個問題出現了,現在當我鍵入它時,會返回相應的搜索結果,並在按del鍵時正常工作。但是,如果我按下另一個字符,如H,U,則它再次變爲空。我有項目,開始與胡.....所以它必須返回.. – 2012-03-13 12:40:39

+0

你確定最終字符串cString = String.valueOf(localItems.get(i));總是返回小寫文本? – dira 2012-03-13 12:47:00

+0

不,這不是必要的。會有任何字符。因爲搜索駱駝案件。 – 2012-03-13 12:56:42

0

我認爲這是因爲這部分

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

     adapter.getFilter().filter(s); 
     adapter.notifyDataSetChanged(); 

嘗試這樣反而..

@Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if(s.length>0) 
{ 
     adapter.getFilter().filter(s); 
     adapter.notifyDataSetChanged(); 
}