在ListFragment中过滤后,ListView未更新

时间:2012-09-24 07:48:24

标签: android listview filter filtering

我有一个listview和一个用于过滤的edittext。我能够在String [] subItems中过滤并保存结果,但listview不会更新。我在Google上搜索过,但我找不到解决方案。

这是代码段。

OnActivityCreated

    public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    setRetainInstance(true);
    setHasOptionsMenu(true);




    lv = getListView();  
    lv.setTextFilterEnabled(true);
    lv.setCacheColorHint(Color.TRANSPARENT);
    lv.setFastScrollEnabled(true);

    lv.setDivider(getResources().getDrawable(android.R.color.black));
    lv.setDividerHeight(1);
//lv.setBackgroundColor(Color.parseColor("#f7f9c3")); //#ffddb0
    lv.setBackgroundDrawable(getResources().getDrawable(R.drawable.merge));
    lv.setScrollingCacheEnabled(false);
    lv.setSmoothScrollbarEnabled(false);    

   adapter  = new IconicAdapter();

    setListAdapter(adapter);



  }

OnCreateView

     @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
      View view = inflater.inflate(R.layout.toc, null);

      filterText = (EditText) view.findViewById(R.id.editTextFilter);
      filterText.addTextChangedListener(filterTextWatcher);
      return view;
  }

FilterTextWatcher

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
        adapter.notifyDataSetChanged();
    }



};

自定义ListView类

 public class IconicAdapter extends ArrayAdapter {

  public String[] allItems;
  public String[] subItems;
  //public ArrayList <String> allItems = new ArrayList<String>();
  //public ArrayList <String> subItems = new ArrayList<String>();

  private TOCFilter filter;  

TextView tx = null;


IconicAdapter() {
super(getActivity(), R.layout.toc_list, Constants.TOC);

this.subItems = new String[Constants.TOC.size()];
this.subItems = Constants.TOC.toArray(this.subItems);
    this.allItems = this.subItems;
}

@Override
public Filter getFilter() {
    if (filter == null){
      filter  = new TOCFilter();
    }
    return filter;
  }


@Override
public int getCount() {
//return Constants.TOC.size();
    return subItems.length;
    } 

@Override
 public String getItem(int position) {
     return subItems[position];
 }

public View getView(int position, View convertView,ViewGroup parent) {
        //LayoutInflater inflater= getLayoutInflater();
    View row = getActivity().getLayoutInflater().inflate(R.layout.toc_list, parent, false);
    //View row=inflater.inflate(R.layout.toc_list, parent, false);
        try
        {
            tx=(TextView)row.findViewById(R.id.mainList);

            tx.setText(Constants.TOC.get(position).toString());
            tx.setTextSize(Constants.txtSize);
            tx.setTextColor(Color.BLACK);
        if(Constants.UKDebug)
        {
            if(position == 0 || position == 1)
            {
               Log.d("iconicadapter", Constants.TOC.get(position) + "");    
            }
        }


            }
            catch (Exception e) {Log.d("main","iconadapter"); e.printStackTrace();}
        return(row);






    }

过滤器类,它是客户列表视图适配器的一部分

private class TOCFilter extends Filter{

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
         FilterResults results = new FilterResults();
         ArrayList<String> i = new ArrayList<String>();
         String[] contents;

          if (constraint!= null && constraint.toString().length() > 0) {

              for (int index = 0; index < allItems.length; index++) {
                  String si = allItems[index];
                  if(si.toLowerCase().startsWith(constraint.toString())){
                    i.add(si);  
                  }
              }
              contents = new String[i.size()];
              i.toArray(contents);
              results.values = contents;
              results.count = contents.length;                   
          }
          else{
              synchronized (allItems){
                  results.values = allItems;
                  results.count = allItems.length;
              }
          }
          return results;
    }

    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        // TODO Auto-generated method stub
        subItems =  (String[]) results.values;
        notifyDataSetChanged();
    }
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我按照以下教程解决了这个问题。

http://justcallmebrian.com/?p=149