Java 使用getFilter函数时ListView为空白

我想实现getFilter()我的功能ListView,但每次我输入的东西EditTextListView就会消失。

我的SetHelpRows档案:

public class SetHelpRows {

String name;

String id;

public String getName () {

return name;

}

public void setName (String name) {

this.name = name;

}

public String getID () {

return id;

}

public void setID (String id) {

this.id = id;

}

public SetHelpRows(String name, String id) {

super();

this.name = name;

this.id = id;

}

}

我的SetHelpRowsCustomAdapter档案:

import java.util.ArrayList;

import android.app.Activity;

import android.content.Context;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.Filter;

import android.widget.ImageView;

import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> {

Context context;

int layoutResourceId;

ArrayList<SetRows> data=new ArrayList<SetRows>();

private ArrayList<SetRows> original;

private ArrayList<SetRows> fitems;

private Filter filter;

public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) {

super(context, layoutResourceId, data);

this.layoutResourceId = layoutResourceId;

this.context = context;

this.data = data;

this.original = data;//new ArrayList<Pkmn>();

this.fitems = data;//new ArrayList<Pkmn>();

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View row = convertView;

ImageHolder holder = null;

if(row == null)

{

LayoutInflater inflater = ((Activity)context).getLayoutInflater();

row = inflater.inflate(layoutResourceId, parent, false);

holder = new ImageHolder();

holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);

holder.txtID = (TextView)row.findViewById(R.id.txtModDate);

row.setTag(holder);

}

else

{

holder = (ImageHolder)row.getTag();

}

SetRows myImage = data.get(position);

holder.txtTitle.setText(myImage.name);

holder.txtID.setText(myImage.id);

int outImage=myImage.image;

holder.imgIcon.setImageResource(outImage);

return row;

}

static class ImageHolder

{

ImageView imgIcon;

TextView txtTitle;

TextView txtID;

}

@Override

public Filter getFilter()

{

if (filter == null) {

Log.i("Before Filter", "Before Filter");

filter = new PkmnNameFilter();

}

return filter;

}

private class PkmnNameFilter extends Filter

{

@Override

protected FilterResults performFiltering(CharSequence constraint)

{

FilterResults results = new FilterResults();

String prefix = constraint.toString().toLowerCase();

if (prefix == null || prefix.length() == 0)

{

Log.i("prefix is null or 0", "prefix is null or 0");

ArrayList<SetRows> list = new ArrayList<SetRows>(original);

results.values = list;

results.count = list.size();

}

else

{

Log.i("prefix is !null or !0", "prefix is !null or !0");

final ArrayList<SetRows> list = new ArrayList<SetRows>(original);

final ArrayList<SetRows> nlist = new ArrayList<SetRows>();

int count = list.size();

for (int i=0; i<count; i++)

{

final SetRows pkmn = list.get(i);

final String value = pkmn.getName().toLowerCase();

if (value.startsWith(prefix))

{

nlist.add(pkmn);

}

}

results.values = nlist;

results.count = nlist.size();

}

return results;

}

@SuppressWarnings("unchecked")

@Override

protected void publishResults(CharSequence constraint, FilterResults results) {

Log.i("publish result", "publish result");

fitems = (ArrayList<SetRows>)results.values;

clear();

int count = fitems.size();

for (int i=0; i<count; i++)

{

SetRows pkmn = (SetRows)fitems.get(i);

add(pkmn);

}

}

}

}

我的部分MainActivity文件:

inputSearch = (EditText) findViewById(R.id.etSearch);

dataList = (ListView) findViewById(R.id.lvFiles);

for (int y=0; y<strNames.length;y++) {

name = strNamesOfAllah[y];

meaning = strMeaning[y];

rowsArray.add(new SetRows(R.drawable.icon, name, meaning));

}

adapter = new SetRowsCustomAdapter(MainActivity.this, R.layout.customlist, rowsArray);

dataList.setAdapter(adapter);

dataList.setClickable(true);

inputSearch.addTextChangedListener(new TextWatcher() {

@Override

public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

// When user changed the Text

//MainActivity.this.adapter.getFilter().filter(cs);

//String text = inputSearch.getText().toString().toLowerCase();

adapter.getFilter().filter(cs.toString().toLowerCase(Locale.US));

}

@Override

public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

//TODO Auto-generated method stub

}

@Override

public void afterTextChanged(Editable arg0) {

//TODO Auto-generated method stub

}

});

在中,LogCat我确实看到以下内容:

12-12 12:15:57.077: I/Before Filter(720): Before Filter

12-12 12:15:57.106: I/prefix is !null or !0(720): prefix is !null or !0

12-12 12:15:57.216: I/publish result(720): publish result

回答:

我修改了我的代码,并使其能够正常工作。如果有人想使用它,请成为我的客人

SetRows Java文件:

public class SetRows {

int image;

String name;

String id;

public int getImage () {

return image;

}

public void setImage (int image) {

this.image = image;

}

public String getName () {

return name;

}

public void setName (String name) {

this.name = name;

}

public String getID () {

return id;

}

public void setID (String id) {

this.id = id;

}

public SetRows(int image, String name, String id) {

super();

this.image = image;

this.name = name;

this.id = id;

}

@Override

public String toString() {

return image + " " + name + " " + id;

}

}

SetRowsCustomAdapter Java文件:

import java.util.ArrayList;

import android.app.Activity;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.Filter;

import android.widget.ImageView;

import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> {

Context context;

int layoutResourceId;

ArrayList<SetRows> data=new ArrayList<SetRows>(); //data = countryList

private ArrayList<SetRows> originalList;

private NameFilter filter;

public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) {

super(context, layoutResourceId, data);

this.layoutResourceId = layoutResourceId;

this.context = context;

this.data = data;

//this.data.addAll(data);

this.originalList = new ArrayList<SetRows>();

this.originalList.addAll(data);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View row = convertView;

ImageHolder holder = null;

if(row == null)

{

LayoutInflater inflater = ((Activity)context).getLayoutInflater();

row = inflater.inflate(layoutResourceId, parent, false);

holder = new ImageHolder();

holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);

holder.txtID = (TextView)row.findViewById(R.id.txtModDate);

row.setTag(holder);

}

else

{

holder = (ImageHolder)row.getTag();

}

SetRows myImage = data.get(position);

holder.txtTitle.setText(myImage.name);

holder.txtID.setText(myImage.id);

int outImage=myImage.image;

holder.imgIcon.setImageResource(outImage);

return row;

}

static class ImageHolder

{

ImageView imgIcon;

TextView txtTitle;

TextView txtID;

}

@Override

public Filter getFilter() {

if (filter == null){

filter = new NameFilter();

}

return filter;

}

private class NameFilter extends Filter

{

@Override

protected FilterResults performFiltering(CharSequence constraint) {

constraint = constraint.toString().toLowerCase();

FilterResults result = new FilterResults();

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

{

ArrayList<SetRows> filteredItems = new ArrayList<SetRows>();

for(int i = 0, l = originalList.size(); i < l; i++)

{

SetRows nameList = originalList.get(i);

if(nameList.toString().toLowerCase().contains(constraint))

filteredItems.add(nameList);

}

result.count = filteredItems.size();

result.values = filteredItems;

}

else

{

synchronized(this)

{

result.values = originalList;

result.count = originalList.size();

}

}

return result;

}

@SuppressWarnings("unchecked")

@Override

protected void publishResults(CharSequence constraint,

FilterResults results) {

data = (ArrayList<SetRows>)results.values;

notifyDataSetChanged();

clear();

for(int i = 0, l = data.size(); i < l; i++)

add(data.get(i));

notifyDataSetInvalidated();

}

}

}

其他一切都保持不变:)

我希望人们发现它对自己的应用有用。

以上是 Java 使用getFilter函数时ListView为空白 的全部内容, 来源链接: utcz.com/qa/408477.html

回到顶部