Android 使用edittext和自定义适配器筛选Json Listview
尝试使用EditText筛选我的Listview,但每次我在EditText上输入文本时,我的Listview都会变为空白,并且不会返回任何结果。我尝试过很多方法,这一种似乎是最容易实现的。任何帮助都将不胜感激 在我的适配器上:Android 使用edittext和自定义适配器筛选Json Listview,android,json,filter,adapter,Android,Json,Filter,Adapter,尝试使用EditText筛选我的Listview,但每次我在EditText上输入文本时,我的Listview都会变为空白,并且不会返回任何结果。我尝试过很多方法,这一种似乎是最容易实现的。任何帮助都将不胜感激 在我的适配器上: public class AdapterTrilhos extends BaseAdapter { private final Activity activity; private LayoutInflater inflater; private List<Tr
public class AdapterTrilhos extends BaseAdapter {
private final Activity activity;
private LayoutInflater inflater;
private List<Trilhos> triList;
private ArrayList<Trilhos> arraylist=null;
public AdapterTrilhos(List<Trilhos> triList, Activity activity) {
this.activity = activity;
this.triList = triList;
this.arraylist = new ArrayList<Trilhos>();
this.arraylist.addAll(triList);
}
@Override
public int getCount() {
return this.triList.size();
}
@Override
public Object getItem(int position) {
return this.triList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.dadoslista, null);
TextView idtxt = (TextView) convertView.findViewById(R.id.txtid);
TextView tittxt = (TextView) convertView.findViewById(R.id.txttit);
// TextView usertxt = convertView.findViewById(R.id.txtuser);
TextView diftxt = (TextView) convertView.findViewById(R.id.txtdif);
RatingBar ratess= (RatingBar) convertView.findViewById(R.id.ratings);
Trilhos t = triList.get(position);
idtxt.setText(String.valueOf(t.getId()));
tittxt.setText(t.getTitulo());
// usertxt.setText(String.valueOf(t.getId_user()));
diftxt.setText(t.getDificuldade());
ratess.setRating(t.getMedia());
return convertView;
}
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
triList.clear();
if (charText.length() == 0) {
triList.addAll(arraylist);
} else {
for (Trilhos cs : arraylist) {
if (cs.getTitulo().toLowerCase(Locale.getDefault()).contains(charText)) {
triList.add(cs);
}
}
}
notifyDataSetChanged();
}
我打算做的是,当我在editText上输入文本时,它只会返回带有我输入的单词的结果。试试这个
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int start, int before, int count) {
// TODO Auto-generated method stub
int textlength = cs.length();
String text = cs.toLowerCase(Locale.getDefault());
adapter.filter(text);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
我认为您应该在活动中直接筛选列表,然后切换到新适配器:
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int start, int before, int count) {
int textlength = cs.length();
String text = search.getText().toString().toLowerCase(Locale.getDefault());
List<Trilhos> filteredList = yourFilterMethod(oldList, text);
mListView.setAdapter(new AdapterTrilhos(filteredList, this));
}
});
private List<Trilhos> yourFilterMethod(List<object> list, String text)
{
// some stuff that filter your list using text and returns the filtered one
return filteredList;
}
search.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int start、int before、int count){
int textlength=cs.length();
String text=search.getText().toString().toLowerCase(Locale.getDefault());
List filteredList=您的筛选方法(旧列表,文本);
setAdapter(新的AdapterTrilhos(filteredList,this));
}
});
私有列表筛选方法(列表、字符串文本)
{
//使用文本过滤列表并返回已过滤列表的某些内容
返回过滤器列表;
}
附加完整的适配器类。已更新,是否应发布所有其他活动?请尝试在筛选器方法中记录字符串值。字符串正确到达,问题是数据不会更新,仅给出空白列表您尝试过此解决方案吗?这是我的工作!同样的结果,空白列表。老兄,我用的是同样的代码,它对我来说非常适合。需要调试一下你就快到了是的,我知道我就快到了,一定是加载或重新加载列表时出错了你的筛选器类中有什么?我应该将筛选器保留在适配器上吗?@Sapo121哪个错误?不,您不应该这样做,因为您现在要在“活动”中筛选列表,将其移动到“活动”并使其返回新列表,而不是直接在适配器上修改。因此,基本上,我需要创建另一个适配器,筛选我的列表并将数据添加到我创建的新适配器?@Sapo121我编辑了我的答案以使用您的类名。您应该有一个适配器来显示数据。然后在活动中使用一个filter方法,该方法返回一个筛选列表,然后在设置为listView的新AdapterTrilhos上使用该列表
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int start, int before, int count) {
int textlength = cs.length();
String text = search.getText().toString().toLowerCase(Locale.getDefault());
List<Trilhos> filteredList = yourFilterMethod(oldList, text);
mListView.setAdapter(new AdapterTrilhos(filteredList, this));
}
});
private List<Trilhos> yourFilterMethod(List<object> list, String text)
{
// some stuff that filter your list using text and returns the filtered one
return filteredList;
}