2016-03-26 6 views
2

У меня проблемы со следующим кодом. Я пытаюсь фильтровать ListView. Содержимое загружается с Firebase, но это не должно быть источником проблемы. Я хочу, чтобы содержимое списка было обновлено во время записи пользователем. Это действительно работает, но проблема заключается в том, когда пользователь удаляет символ: список обновляется только с результатом исследования прецедента. Так, например, с первоначальным списком: «Мадрид», «В основном». Если пользователи напишут «Безумный», «Мадрид» будет единственным, который будет отображаться. Но когда он удалит «d» («Ma» влево), «Mainly» не будет отображаться.Фильтр по списку не работает должным образом

Странно то, что когда я не использую clear() и addAll (values) в publishResult из моего адаптера, удаление символов работает, но фильтрация выполняется только по количеству элементов. Например, для списка из 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

Фантастический! Буду признателен, если вы ответите правильно. –

Смежные вопросы