2016-03-26 75 views
2

我遇到了下列代码的麻烦。我试图过滤ListView。内容是从Firebase下载的,但这不应该是问题的根源。我希望在用户写入时更新列表的内容。它实际上工作,但问题是当用户删除一个字符:该列表只会更新与先前的研究结果。例如最初的清单:“马德里”,“主要”。如果用户写入“疯狂”,则将仅显示“马德里”。但是当他删除“d”(“Ma”左侧)时,“Mainly”将不会显示。在列表上过滤器无法正常工作

奇怪的是,当我不在我的适配器中使用publishResult中的clear()和addAll(values)时,删除字符有效,但过滤仅在多个元素中完成。例如,对于100个元素的列表,如果14匹配,则仅显示前14个元素,而不显示14个匹配元素。

如果有人看到,为什么我错了,与此代码,答案将是受欢迎的:)

适配器

import android.content.Context; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.util.Log; 
import java.util.ArrayList; 

public class AdapterCourseList extends ArrayAdapter<String> { 
    public Context context; 
    public ArrayList<String> values; 
    final public ArrayList<String> originalValues; 
    private static final String TAG = AdapterCourseList.class.getSimpleName(); 

    public AdapterCourseList(Context context, ArrayList<String> valeurs){ 
     super(context, android.R.layout.simple_list_item_1, valeurs); 
     this.context = context; 
     this.values = valeurs; 
     this.originalValues = valeurs; 
    } 

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

    public Filter getFilter() { 
     Filter mfilter = new Filter() { 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       values = (ArrayList<String>)results.values; 
       clear(); 
       notifyDataSetChanged(); 
       addAll(values); 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults result = new FilterResults(); 

       ArrayList<String> res = new ArrayList<>(); 
       for(String d: originalValues){ 
        Log.d(TAG,d); 

        if(d.toUpperCase().contains(constraint.toString().toUpperCase())){ 
         res.add(d); 

        } 
       } 

       result.count = res.size(); 
       result.values = res; 

       return result; 
      } 
     }; 

     return mfilter; 
    } 
} 

活动

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class CourseListActivity extends AppCompatActivity { 
    private EditText edit_search; 
    private AdapterCourseList adapter; 
    private ListView listView; 

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

     SimpleFirebase ref = new SimpleFirebase(this); 
     final ArrayList<String> stringList = ref.getCurses(); 

     edit_search = (EditText) findViewById(R.id.edit_search); 
     listView = (ListView) findViewById(R.id.courseList); 
     adapter = new AdapterCourseList(this, stringList); 
     listView.setAdapter(adapter); 

     edit_search.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 

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

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

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String d = adapter.getItem(position); 

       Intent i = new Intent(CourseListActivity.this, AddFormActivity.class); 
       i.putExtra("Course", d); 

       CourseListActivity.this.setResult(1, i); 
       CourseListActivity.this.finish(); 
      } 
     }); 
    } 
} 

回答

0

要覆盖所有这些方法在ArrayAdapter - 你可能不需要。

ArrayAdapter已经实现了Filterable,并且会返回一个Filter,它会像您一样进行不区分大小写的比较。你应该尝试使用默认的实现,因为它很可能会做你想做的事情。

问题发生是因为clear()addAll()ArrayAdapter的内部列表上操作。但是,您正在使用您自己的getCount()列表,因此您的适配器具有一些分离的个性。如果您需要覆盖方法,请尝试扩展BaseAdapter;你会有更多的代码行,但它将更清楚地说明所有状态的来源。

+0

不重写这些方法解决了问题。谢谢 ! – Fish

+0

太棒了!如果您接受我的回答是正确的,我将不胜感激。 –

相关问题