【发布时间】:2014-04-28 12:31:32
【问题描述】:
我是 android 编程的新手,并尝试在我的自定义 ArrayAdapter 中实现 getFilter() 并按名称过滤列表。 我没有找到任何与我的适配器匹配的示例。
谁能帮我举个例子(用我的代码),谢谢!!!
也许还有另一种过滤列表的可能性?
java代码:
public class c_DTArtikel_allforsearch extends Activity implements AdapterView.OnItemClickListener {
private ListView ListViewLayout;
private EditText search;
private String[] Name;
private String[] Number;
private int[] ImagesID;
private ArrayList<Article> articleList = new ArrayList<Article>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_lv_search);
Resources res = getResources();
String[] saugname = res.getStringArray(R.array.SauglanzeName);
String[] pumpmname = res.getStringArray(R.array.PumpMName);
String[] saugnummer = res.getStringArray(R.array.SauglanzeNumber);
String[] pumpmnummer = res.getStringArray(R.array.PumpMNummer);
TypedArray saugimg = res.obtainTypedArray(R.array.SauglanzeImg);
TypedArray pumpmimg = res.obtainTypedArray(R.array.PumpeMImg);
ArrayList<String> name = new ArrayList<String>();
name.addAll(Arrays.asList(saugname));
name.addAll(Arrays.asList(pumpmname));
Name = name.toArray(new String[saugname.length+pumpmname.length]);
ArrayList<String> number = new ArrayList<String>();
number.addAll(Arrays.asList(saugnummer));
number.addAll(Arrays.asList(pumpmnummer));
Number = number.toArray(new String[saugnummer.length+pumpmnummer.length]);
ArrayList<Integer> imgInts = new ArrayList<Integer>();
int nr = -1;
while ( ++nr < saugimg.length() )
imgInts.add (saugimg.getResourceId(nr, 0));
nr = -1;
while ( ++nr < pumpmimg.length() )
imgInts.add (pumpmimg.getResourceId(nr, 0));
ImagesID = new int[imgInts.size()];
for (int i=0; i < imgInts.size(); i++)
{
ImagesID[i] = ((Integer) imgInts.get(i)).intValue();
}
Search = (EditText) findViewById(R.id.EditTextSearch);
ListViewLayout = (ListView) findViewById(R.id.listViewLayoutSearch);
final TIAdapter adapter = new TIAdapter(articleList, this);
ListViewLayout.setAdapter(adapter);
ListViewLayout.setOnItemClickListener(this);
//has been missing
for (int i = 0; i < Name.length; i++)
{
Article a = new Article(Name[i], Number[i], ImagesID[i]);
// Binds all strings into an array
articleList.add(a);
}
// Add Text Change Listener to EditText
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
System.out.println("Text ["+s+"] - Start ["+start+"] - Before ["+before+"] - Count ["+count+"]");
if (count < before) {
// We're deleting char so we need to reset the adapter data
adapter.resetData();
}
adapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
课堂文章
public class Article {
public String Name;
public String Number;
public int ImagesID;
public Article(String Name, String Number, int ImagesID) {
this.Name = Name;
this.Number = Number;
this.ImagesID = ImagesID;
}
public String getName() {
return Name;
}
public void setName(String name) {
this.Name = Name;
}
public String getNumber() {
return Number;
}
public void setNumber(String number) {
this.Name = Number;
}
public int getImgID() {
return ImagesID;
}
public void setImgID(int imgID) {
this.ImagesID = ImagesID;
}
}
类自定义适配器:
class TIAdapter extends ArrayAdapter<Article> implements Filterable {
private List<Article> articleList;
private Context context;
private Filter articleFilter;
private List<Article> origArticleList;
TIAdapter(List<Article> articleList, Context ctx) {
super (ctx, R.layout.layout_text_image, articleList);
this.articleList = articleList;
this.context = ctx;
this.origArticleList = articleList;
}
public int getCount() {
return articleList.size();
}
public Article getItem(int position) {
return articleList.get(position);
}
public long getItemId(int position) {
return articleList.get(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ArticleHolder holder = new ArticleHolder();
if (convertView == null) {
// This a new view we inflate the new layout
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.layout_text_image, null);
// Now we can fill the layout with the right values
holder.textViewArtikel = (TextView) v.findViewById(R.id.textViewArtikel);
holder.textViewArtikelNummer = (TextView) v.findViewById(R.id.textViewArtikelNummer);
holder.imageViewArtikel = (ImageView) v.findViewById(R.id.imageViewArtikel);
v.setTag(holder);
}
else {
holder = (ArticleHolder) v.getTag();
holder.imageViewArtikel = (ImageView) v.findViewById(R.id.imageViewArtikel);
DecodeTask dt1 = (DecodeTask)holder.imageViewArtikel.getTag(R.id.imageViewArtikel);
if(dt1 != null)
dt1.cancel(true);
}
final Article n = articleList.get(position);
holder.imageViewArtikel.setImageBitmap(null);
DecodeTask dt2 = new DecodeTask(getContext(), holder.imageViewArtikel, n.getImgID());
dt2.execute();
holder.textViewArtikel.setText(n.getName());
holder.textViewArtikelNummer.setText(n.getNumber());
holder.imageViewArtikel.setTag(n.getImgID(), dt2);
return v;
}
public void resetData() {
articleList = origArticleList;
}
private class ArticleHolder {
TextView textViewArtikel;
TextView textViewArtikelNummer;
ImageView imageViewArtikel;
}
@Override
public Filter getFilter() {
if (articleFilter == null)
articleFilter = new ArticleFilter();
return articleFilter;
}
private class ArticleFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
// We implement here the filter logic
if (constraint == null || constraint.length() == 0) {
// No filter implemented we return all the list
results.values = origArticleList;
results.count = origArticleList.size();
}
else {
// We perform filtering operation
List<Article> nArticleList = new ArrayList<Article>();
for (Article a : articleList) {
if (a.getName().toLowerCase().contains(constraint.toString().toLowerCase()))
nArticleList.add(a);
}
results.values = nArticleList;
results.count = nArticleList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// Now we have to inform the adapter about the new list filtered
if (results.count == 0)
notifyDataSetInvalidated();
else {
articleList = (List<Article>) results.values;
notifyDataSetChanged();
}
}
}
}
}
}
这是旧 getView() 的代码;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ImageView imageView = null;
if(row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.layout_text_image, parent, false);
imageView = (ImageView)row.findViewById(R.id.imageViewArtikel);
}
else {
imageView = (ImageView)row.findViewById(R.id.imageViewArtikel);
DecodeTask dt1 = (DecodeTask)imageView.getTag(R.id.imageViewArtikel);
if(dt1 != null)
dt1.cancel(true);
}
imageView.setImageBitmap(null);
DecodeTask dt2 = new DecodeTask(getContext(), imageView, ImagesID[position]);
dt2.execute();
TextView textViewArtikel = (TextView) row.findViewById(R.id.textViewArtikel);
TextView textViewArtikelNummer = (TextView) row.findViewById(R.id.textViewArtikelNummer);
imageView.setTag(R.id.imageViewArtikel, dt2);
textViewArtikel.setText(Name[position]);
textViewArtikelNummer.setText(Number[position]);
return row;
}
解码任务
public class DecodeTask extends AsyncTask<String, Void, Bitmap> {
Context mContext;
ImageView v;
int resId;
public DecodeTask(Context context, ImageView iv, int res_id) {
mContext = context;
v = iv;
resId = res_id;
}
protected Bitmap doInBackground(String... params) {
return decodeBitmapFromResource(resId, 300, 300);
}
protected void onPostExecute(Bitmap result) {
v.setImageBitmap(result);
}
private Bitmap decodeBitmapFromResource(int resId, int reqWidth, int reqHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(mContext.getResources(), resId, options);
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), resId, options);
return bmp;
}
}
错误日志:
05-03 10:56:43.922 28792-28792/com.kreussler.krapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.kreussler.krapp.c_DTArtikel_allforsearch$TIAdapter.getView(c_DTArtikel_allforsearch.java:286)
at android.widget.AbsListView.obtainView(AbsListView.java)
at android.widget.ListView.measureHeightOfChildren(ListView.java)
at android.widget.ListView.onMeasure(ListView.java)
at android.view.View.measure(View.java)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
at android.view.View.measure(View.java)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
at android.widget.FrameLayout.onMeasure(FrameLayout.java)
at android.view.View.measure(View.java)
at android.widget.LinearLayout.measureVertical(LinearLayout.java)
at android.widget.LinearLayout.onMeasure(LinearLayout.java)
at android.view.View.measure(View.java)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
at android.widget.FrameLayout.onMeasure(FrameLayout.java)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java)
at android.view.View.measure(View.java)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
at android.view.Choreographer.doCallbacks(Choreographer.java)
at android.view.Choreographer.doFrame(Choreographer.java)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
Sergej 正如我之前所说,您首先必须调整适配器构造函数以接受一个项目数组而不是三个数组。只有在没问题的情况下,您才能实现 getFilter() 方法。同时,您将一直在阅读此论坛并找到今天的帖子stackoverflow.com/questions/23339478/… 在那里您会看到项目数组如何称为
以及如何声明类 Users。你也必须这样做。以这种方式使您的适配器首先工作(不过滤)。您必须在适配器中调整很多代码,但这很容易。 -
嗨,我几乎更新了代码。我无法解决的一件事是我的课堂文章。我收到错误“不兼容的类型”。我的数组是 Strind[]、String[]、Int[] 并且该类需要的是 String、String、Int。我可以转换这个吗?如果是的话怎么办?代码更新了
-
它有效,请参阅上面的“已丢失”。现在我可以过滤了。但他们是从第一个字母开始过滤的。例如,如果我输入“a”,则列表仅显示以“a”开头的单词。我还需要为图片实现异步任务,因为列表很慢。
-
你做得很快!你忘了调整:final TIAdapter adapter = new TIAdapter(this, Name, Number, ImagesID);稍后将深入您的代码...
-
你的意思是以a开头的句子。那是因为在你的过滤器中你使用了startsWith("a")。为条件添加一些内容或更改它。
标签: java android android-listview android-adapter custom-adapter