2012-03-13 20 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); 

のMy機能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

ArrayList<String> itemsArrayList<String> filteredItemsProjectArrayAdapter中とArrayAdapterList<T> mObjects;は同じArrayListインスタンスを参照してください。 (それはゼロでなければならないitems.size()をチェックし、ArrayAdapterclear()メソッドを呼び出します。)

  1. this.items = new ArrayList<String>(titles);

  2. publishResults()方法で(コンストラクタで)this.items = (ArrayList<String>)titles;を交換しonTextChanged

  3. からこのラインadapter.notifyDataSetChanged();を削除する必要があります次のように見える...

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

ProjectArrayAdapterArrayList<String> filteredItems;が必要ですか?それが必要でない場合は取り外してください。

+0

それは男の作品です!どうもありがとう。私はちょうどこれ以上の2日を過ごした。 。ほんとうに素晴らしい。もう一度おねがいします! しかし、別の問題が出てきます。私はそれを入力すると適切な検索結果を返し、delキーを押すとうまくいきます。しかし、もし私がHのような別のキャラクターを押すと、それからUは再び空になります。私はHUで始まるプロジェクトを..... .....それはそれを返す必要があります.. –

+0

あなたは確かですか最終的なString cString = String.valueOf(localItems.get(i));常に小文字のテキストを返しますか? – dira

+0

それは必要ではありません。文字があります。ラクダのケースで検索しているから。 –

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(); 
} 
関連する問題