2013-11-22 57 views
5

這裏是代碼,我使用了一個自定義適配器,並應用了Filter方法,現在ListView在輸入退格鍵時不會更新,當從切換回來時項目活動。我讀過它是一個過濾器中的錯誤,但我怎麼繞過它,我知道已經實現了我想要的這種設置的應用程序。繞過不更新ListView的過濾中的錯誤Android

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
    ListView listView; 
    EditText editTextB; 
    PagesAdapter adapter1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.pageList); 
     editTextB = (EditText) findViewById(R.id.searchB); 
     adapter1 = new PagesAdapter(this); 
     listView.setAdapter(adapter1); 
     adapter1.notifyDataSetChanged(); 
     listView.setOnItemClickListener(this); 

     editTextB.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       IndexPageActivity.this.adapter1.getFilter().filter(cs.toString()); 
       adapter1.notifyDataSetChanged(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, 
         int arg2, int arg3) { } 

      @Override 
      public void afterTextChanged(Editable arg0) { } 
     }); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
     Intent i; 
     String name = adapter1.getItem(position); 
     Log.d("id", name); 

     if (name.equals("Item1")) 
     { 
      i = new Intent(this, anActivity.class); 
      startActivity(i); 
     } 
     else if (name.equals("Item2")) 
     { 
      i = new Intent(this, anActivity2.class); 
      startActivity(i); 
     } 
    } 
} 

class SingleRow { 
    String pagedata; 
    SingleRow(String pagedata){ 
     this.pagedata=pagedata; 
    } 
} 
class PagesAdapter extends BaseAdapter implements Filterable{ 
    ArrayList<String> pagelist; 
    List<String> arrayList; 
    Context context; 
    String [] pagedatas; 

    PagesAdapter(Context c){ 
     context=c; 
     pagelist = new ArrayList<String>(); 
     Resources res = c.getResources(); 
     pagedatas = res.getStringArray(R.array.pages_data); 
     for (int i=0;i<463;i++){ 
      pagelist.add(pagedatas[i]); 
     } 
    } 
    @Override 
    public int getCount() { 
     return pagelist.size(); 
    } 

    @Override 
    public String getItem(int i) { 
     return pagelist.get(i); 
    } 

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

    @Override 
    public View getView(int i, View view, ViewGroup viewG) { 
     LayoutInflater inflater=(LayoutInflater)    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row=inflater.inflate(R.layout.single_row,viewG,false); 
     TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); 

     String temp=pagelist.get(i); 

     pagetitle.setText(temp); 
     return row; 
    } 

    public class filter_here extends Filter{ 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults Result = new FilterResults(); 
      // if constraint is empty return the original names 
      if(constraint.length() == 0){ 
       Result.values = pagelist; 
       Result.count = pagelist.size(); 
       return Result; 
      } 

      ArrayList<String> Filtered_Names = new ArrayList<String>(); 
      String filterString = constraint.toString().toLowerCase(); 
      String filterableString; 

      for(int i = 0; i<pagelist.size(); i++){ 
       filterableString = pagelist.get(i); 
       if(filterableString.toLowerCase().contains(filterString)){ 
        Filtered_Names.add(filterableString); 
       } 
      } 
      Result.values = Filtered_Names; 
      Result.count = Filtered_Names.size(); 

      return Result; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint,FilterResults results) { 
      pagelist = (ArrayList<String>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public Filter getFilter() { 
     return new filter_here(); 
    } 
} 

回答

3

終於找到了退格的錯誤,你的過濾功能有一定的誤差,這是回,而不是持有該變量的代碼列表一個ArrayList,應該最終代碼:

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
ListView listView; 
EditText editTextB; 
PagesAdapter adapter1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.pageList); 
     editTextB = (EditText) findViewById(R.id.searchB); 
     adapter1 = new PagesAdapter(this); 
     listView.setAdapter(adapter1); 
     adapter1.notifyDataSetChanged(); 
     listView.setOnItemClickListener(this); 

     editTextB.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, 
        int arg3) { 
       // When user changed the Text 
       IndexPageActivity.this.adapter1.getFilter().filter(cs.toString()); 
       adapter1.notifyDataSetChanged(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, 
        int arg2, int arg3) { 
       // TODO Auto-generated method stub 

      } 

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


@Override 
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
// TODO Auto-generated method stub 
Intent i; 
String name = adapter1.getItem(position); 
     Log.d("id", name); 
if (name.equals("Item1")) 
{ 
    i = new Intent(this, anActivity.class); 
    startActivity(i); 
} 
else if (name.equals("Item2")) 
{ 
    i = new Intent(this, anActivity2.class); 
    startActivity(i); 
} 
} 
} 


class SingleRow { 
String pagedata; 
SingleRow(String pagedata){ 
    this.pagedata=pagedata; 
} 
} 
class PagesAdapter extends BaseAdapter implements Filterable{ 
ArrayList<String> pagelist; 
List<String> arrayList; 
Context context; 
String [] pagedatas; 

PagesAdapter(Context c){ 
context=c; 
pagelist = new ArrayList<String>(); 
Resources res = c.getResources(); 
pagedatas = res.getStringArray(R.array.pages_data); 

for (int i=0;i<463;i++){ 
    pagelist.add(pagedatas[i]); 
} 
arrayList = pagelist; 
} 
@Override 
public int getCount() { 
// TODO Auto-generated method stub 
return arrayList.size(); 
} 

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

@Override 
public String getItem(int i) { 
// TODO Auto-generated method stub 
return arrayList.get(i); 
} 

@Override 
public long getItemId(int i) { 
// TODO Auto-generated method stub 
return i; 
} 


@Override 
public View getView(int i, View view, ViewGroup viewG) { 
// TODO Auto-generated method stub 
LayoutInflater inflater=(LayoutInflater)     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View row=inflater.inflate(R.layout.single_row,viewG,false); 
TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); 

String temp=arrayList.get(i); 

pagetitle.setText(temp); 
return row; 
} 

@Override 
public Filter getFilter() { 
// TODO Auto-generated method stub 
Filter filter = new Filter() { 
    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     arrayList = (List<String>) results.values; 
     notifyDataSetChanged(); 
    } 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

    FilterResults results = new FilterResults(); 
     ArrayList<String> FilteredArrayNames = new ArrayList<String>(); 

     if (pagelist == null) { 
      pagelist = new ArrayList<String>(arrayList); 
     } 
     if (constraint == null || constraint.length() == 0) { 
      results.count = pagelist.size(); 
      results.values = pagelist; 
     } else { 
      constraint = constraint.toString().toLowerCase(); 
      for (int i = 0; i < pagelist.size(); i++) { 
       String dataNames = pagelist.get(i); 
       if (dataNames.toLowerCase().startsWith(constraint.toString())) { 
        FilteredArrayNames.add(dataNames); 
       } 
      } 

      results.count = FilteredArrayNames.size(); 
      System.out.println(results.count); 

      results.values = FilteredArrayNames; 
      Log.e("VALUES", results.values.toString()); 
     } 

     return results; 
} 
}; 
return filter; 
} 
} 
+0

謝謝你,我會投入這一點,並儘快給您儘快!非常感謝..所有積分給你Coderji! –

+0

告訴我做到了嗎?! – Coderji

+0

是的Coderji!它確實起作用了,另一件事發生了,當我在editText中輸入Twinkle時,它帶來了相關的項目,當我使用退格將它們全部刪除時,顯示的列表將是以第一個字母「T」開始的項目在一瞬間。如果在editText中輸入Chocolate,則退出時,只有以「C」開頭的項目纔會顯示在ListView中。老闆幹得好! –

1

如何把

adapter1.notifyDataSetChanged(); 

中的onResume活動的()方法?

+0

行不通@ HarshSingal –

4

1)退格過濾

在你publishResults,要修改你的pagelist,因此,如果您按空格鍵,並再次過濾,pagelist只包含原始pagelist項目的一小部分:

所以,您需要保留原始數據的副本!喜歡的東西:

List<String> allData; 

PagesAdapter(Context c) { 
    ... 
    allData = pagelist; 
    ... 
} 

,並在您的濾波方法,使用ALLDATA對象:

for (int i = 0; i < allData.size(); i++) { 
    filterableString = allData.get(i); 
    if (filterableString.toLowerCase().contains(filterString)) { 
     Filtered_Names.add(filterableString); 
    } 
} 

,並在那裏你重置您的數據備份到原來的:

// if constraint is empty return the original names 
if (constraint.length() == 0) { 
    Result.values = allData; 
    Result.count = allData.size(); 
    return Result; 
} 

2)從其他活動返回後清除過濾器:

This c一來在做的onResume ......就個人而言,我會明確的EDITTEXT文本作爲過濾器復位,像這樣:

@Override 
protected void onResume() { 
    if (editTextB != null) { 
     editTextB.setText(""); 
    } 
    super.onResume(); 
}