gpt4 book ai didi

java - 列表中的过滤器无法正常工作

转载 作者:行者123 更新时间:2023-12-03 03:12:08 25 4
gpt4 key购买 nike

我在使用以下代码时遇到问题。我正在尝试过滤 ListView。内容是从 Firebase 下载的,但这不应该是问题的根源。我希望在用户写入时更新列表的内容。它实际上有效,但问题是当用户删除一个字符时:列表仅根据先前研究的结果进行更新。例如,初始列表:“马德里”、“主要”。如果用户写“Mad”,则只会显示“Madrid”。但当他删除“d”(“Ma”左边)时,“主要”将不会显示。

一件奇怪的事情是,当我在适配器的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;
}
}

Activity

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();
}
});
}
}

最佳答案

您将重写 ArrayAdapter 中的所有这些方法——而且您可能不需要这样做。

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

出现此问题的原因是 clear()addAll()ArrayAdapter 的内部列表进行操作。但是,您使用自己的 getCount() 列表,因此您的适配器有点人格 split 。如果您需要重写方法,请尝试扩展BaseAdapter;您将有更多的代码行,但会更清楚所有状态的来源。

关于java - 列表中的过滤器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com