实现用getFilter()。与AsyncTask的定制ArrayAdapter [英] implementing getFilter(). into custom ArrayAdapter with AsyncTask

查看:178
本文介绍了实现用getFilter()。与AsyncTask的定制ArrayAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在机器人编程i'm新手,试图实现用getFilter()到我的自定义ArrayAdapter的过滤器列表的名称。
我还没有发现与我的适配器相匹配的例子。

有人可以帮助我用一个例子,请(我的code),THX!

也许还有另一种可能性,以过滤列表?

Java的code:

 公共类c_DTArtikel_allforsearch扩展活动实现AdapterView.OnItemClickListener {私人的ListView ListViewLayout;
私人的EditText搜索;
私有String []名称;
私有String []号;
私人诠释[] ImagesID;
私人ArrayList的<物品> articleList =新的ArrayList<物品>();
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.layout_lv_search);
    资源解析度= getResources();    的String [] = saugname res.getStringArray(R.array.SauglanzeName);
    的String [] = pumpmname res.getStringArray(R.array.PumpMNa​​me);    的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的<串GT; NAME =新的ArrayList<串GT;();
    name.addAll(Arrays.asList(saugname));
    name.addAll(Arrays.asList(pumpmname));
    名称= name.toArray(新的String [saugname.length + pumpmname.length]);    ArrayList的<串GT;数=新的ArrayList<串GT;();
    number.addAll(Arrays.asList(saugnummer));
    number.addAll(Arrays.asList(pumpmnummer));
    数= number.toArray(新的String [saugnummer.length + pumpmnummer.length]);    ArrayList的<整数GT; imgInts =新的ArrayList<整数GT;();
    INT NR = -1;
    而(++ NR< saugimg.length())
        imgInts.add(saugimg.getResourceId(NR 0));
    NR = -1;
    而(++ NR< pumpmimg.length())
        imgInts.add(pumpmimg.getResourceId(NR 0));
        ImagesID =新INT [imgInts.size()];
    的for(int i = 0; I< imgInts.size();我++)
    {
        ImagesID [I] =((整数)imgInts.get(ⅰ))的intValue();
    }
    搜索=(EditText上)findViewById(R.id.EditTextSearch);    ListViewLayout =(ListView控件)findViewById(R.id.listViewLayoutSearch);    最后TIAdapter适配器=新TIAdapter(articleList,这一点);
    ListViewLayout.setAdapter(适配器);
    ListViewLayout.setOnItemClickListener(本);    //已经失踪
        的for(int i = 0; I< Name.length;我++)
    {
        第一个=新的文章(名称[I],号码[I],ImagesID [I]);
        //绑定所有字符串到一个数组
        articleList.add(一);
    }    //添加文本变化监听到的EditText
   sea​​rch.addTextChangedListener(新TextWatcher(){        @覆盖
        公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
            的System.out.println(文本[+ S + - 启动[+ +中启动] - 在[+前+] - 计数[+数+]);
            如果(计数<前){
                //我们删除字符,所以我们需要重置适配器数据
                adapter.resetData();
            }            。adapter.getFilter()过滤(s.toString());        }        @覆盖
        公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
                                     INT后){        }        @覆盖
        公共无效afterTextChanged(编辑S){
        }
    });
}

第三级

 公共类文章{    公共字符串名称;
    公共串号;
    公众诠释ImagesID;    公共物品(字符串名称,串号,诠释ImagesID){        this.Name =名称;
        this.Number =数字;
        this.ImagesID = ImagesID;
    }
    公共字符串的getName(){
        返回名称;
    }
    公共无效setname可以(字符串名称){
        this.Name =名称;
    }
    公共字符串getNumber(){
        返回的数量;
    }
    公共无效setNumber(串号){
        this.Name =数字;
    }
    公众诠释getImgID(){
        返回ImagesID;
    }
    公共无效setImgID(INT imgID){
        this.ImagesID = ImagesID;
    }
}

类自定义适配器:

 类TIAdapter扩展ArrayAdapter<物品>实现可筛选{
    私人列表<物品> articleList;
    私人上下文的背景下;
    私人过滤articleFilter;
    私人列表<物品> origArticleList;    TIAdapter(列表<物品> articleList,上下文CTX){
        超(CTX,R.layout.layout_text_image,articleList);
        this.articleList = articleList;
        this.context = CTX;
        this.origArticleList = articleList;
    }    公众诠释的getCount(){
        返回articleList.size();
    }    公共物品的getItem(INT位置){
        返回articleList.get(位置);
    }    众长getItemId(INT位置){
        返回articleList.get(位置).hash code();
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        视图V = convertView;
        ArticleHolder持有人=新ArticleHolder();
        如果(convertView == NULL){
            //这是一个新的观点,我们膨胀的新布局
            LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            V = inflater.inflate(R.layout.layout_text_image,NULL);            //我们现在可以填写了正确的价值观布局
            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(保持器);
        }
        其他{            支架=(ArticleHolder)v.getTag();
            holder.imageViewArtikel =(ImageView的)v.findViewById(R.id.imageViewArtikel);
            德codeTask DT1 =(德codeTask)holder.imageViewArtikel.getTag(R.id.imageViewArtikel);
            如果(DT1!= NULL)
                dt1.cancel(真);
        }        最后一篇文章N = articleList.get(位置);        holder.imageViewArtikel.setImageBitmap(NULL);
        德codeTask DT2 =新德codeTask(的getContext(),holder.imageViewArtikel,n.getImgID());
        dt2.execute();        holder.textViewArtikel.setText(n.getName());
        holder.textViewArtikelNummer.setText(n.getNumber());
        holder.imageViewArtikel.setTag(n.getImgID(),DT2);
        返回伏;
    }    公共无效resetData(){
        articleList = origArticleList;
    }    私有类ArticleHolder {
        TextView的textViewArtikel;
        TextView的textViewArtikelNummer;
        ImageView的imageViewArtikel;
    }
    @覆盖
    公共过滤用getFilter(){
        如果(articleFilter == NULL)
            articleFilter =新ArticleFilter();        返回articleFilter;
    }    私有类ArticleFilter扩展过滤器{        @覆盖
        保护FilterResults performFiltering(CharSequence的约束){
            FilterResults结果=新FilterResults();
            //我们在这里实现滤波器逻辑
            如果(约束== NULL || constraint.length()== 0){
                //没有滤波器来实现,我们返回所有列表
                results.values​​ = origArticleList;
                results.count = origArticleList.size();
            }
            其他{
                //我们进行过滤操作
                清单<物品> nArticleList =新的ArrayList<物品>();                对(第一个:articleList){
                    如果(a.getName()。与toLowerCase()。含有(constraint.toString()。与toLowerCase()))
                        nArticleList.add(一);
                }                results.values​​ = nArticleList;
                results.count = nArticleList.size();            }
            返回结果;
        }        @覆盖
        保护无效publishResults(CharSequence的约束,
                                      FilterResults结果){            //现在我们必须告知适配器有关筛选新的列表
            如果(results.count == 0)
                notifyDataSetInvalidated();
            其他{
                articleList =(列表<物品>)results.values​​;
                notifyDataSetChanged();
            }        }    }
}    }
}

下面是从旧getView()的code;

  @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        查看排= convertView;
        ImageView的ImageView的= NULL;        如果(行== NULL){
            LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            行= inflater.inflate(R.layout.layout_text_image,父母,假);
            ImageView的=(ImageView的)row.findViewById(R.id.imageViewArtikel);
        }
        其他{
            ImageView的=(ImageView的)row.findViewById(R.id.imageViewArtikel);
            德codeTask DT1 =(德codeTask)imageView.getTag(R.id.imageViewArtikel);
            如果(DT1!= NULL)
                dt1.cancel(真);
        }
        imageView.setImageBitmap(NULL);
        德codeTask DT2 =新德codeTask(的getContext(),ImageView的,ImagesID [位置]);
        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(名称[位置]);
        textViewArtikelNummer.setText(号码[位置]);
        返回行;
    }

德code任务

 公共类德codeTask延伸的AsyncTask<弦乐,太虚,位图> {
    上下文mContext;
    ImageView的伏;
    INT渣油;    公共德codeTask(上下文的背景下,第四ImageView的,诠释RES_ID){
        mContext =背景;
        V = IV;
        渣油= RES_ID;
    }
    保护位图doInBackground(字符串... PARAMS){
        返回德codeBitmapFromResource(渣油,300,300);
    }
    保护无效onPostExecute(位图结果){
        v.setImageBitmap(结果);
    }
    私人位图德codeBitmapFromResource(INT渣油,诠释reqWidth,诠释reqHeight){
        BitmapFactory.Options选项=新BitmapFactory.Options();
        options.inJustDe codeBounds = TRUE;
        BitmapFactory.de codeResource(mContext.getResources(),渣油,期权);
        options.inJustDe codeBounds = FALSE;
        BMP位图= BitmapFactory.de codeResource(mContext.getResources(),渣油,期权);
        返回BMP;
    }}

错误的logcat:

  10月5日至3日:56:43.922 28792-28792 / com.kreussler.krapp E / AndroidRuntime:致命异常:主要
显示java.lang.NullPointerException
        在com.kreussler.krapp.c_DTArtikel_allforsearch $ TIAdapter.getView(c_DTArtikel_allforsearch.java:286)
        在android.widget.AbsListView.obtainView(AbsListView.java)
        在android.widget.ListView.measureHeightOfChildren(ListView.java)
        在android.widget.ListView.onMeasure(ListView.java)
        在android.view.View.measure(View.java)
        在android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java)
        在android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
        在android.view.View.measure(View.java)
        在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
        在android.widget.FrameLayout.onMeasure(FrameLayout.java)
        在android.view.View.measure(View.java)
        在android.widget.LinearLayout.measureVertical(LinearLayout.java)
        在android.widget.LinearLayout.onMeasure(LinearLayout.java)
        在android.view.View.measure(View.java)
        在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
        在android.widget.FrameLayout.onMeasure(FrameLayout.java)
        在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java)
        在android.view.View.measure(View.java)
        在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
        在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
        在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
        在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
        在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java)
        在android.view.Choreographer $ CallbackRecord.run(Choreographer.java)
        在android.view.Choreographer.doCallbacks(Choreographer.java)
        在android.view.Choreographer.doFrame(Choreographer.java)
        在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java)
        在android.os.Handler.handleCallback(Handler.java)
        在android.os.Handler.dispatchMessage(Handler.java)
        在android.os.Looper.loop(Looper.java)
        在android.app.ActivityThread.main(ActivityThread.java)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
        在dalvik.system.NativeStart.main(本机方法)


解决方案

因为我发现你的问题有趣的我做了一个活动与code。
我面临的最大的问题是在哪里得到约250张。我首先想
问你,但比设法调整306图片为100x100,并把
他们在绘制文件夹中。这里是改变getView()

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){
    视图V = convertView;
    ArticleHolder持有人=新ArticleHolder();    最后一篇文章N = articleList.get(位置);    如果(convertView == NULL){
        LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        V = inflater.inflate(R.layout.activity_sergej_lazy_res_listitem,NULL);        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(保持器);
    }
    其他{        支架=(ArticleHolder)v.getTag();
        德codeTask DT1 =(德codeTask)holder.imageViewArtikel.getTag();
        如果(DT1!= NULL)
          dt1.cancel(真);
      }
    holder.textViewArtikel.setText(n.getName());
    holder.textViewArtikelNummer.setText(n.getNumber());    holder.imageViewArtikel.setImageBitmap(NULL);
    德codeTask DT2 =新德codeTask(的getContext(),holder.imageViewArtikel,n.getImgID(),位置);
    holder.imageViewArtikel.setTag(DT2);
    dt2.execute();    返回伏;
}

作为100×100的图像被用来就没有必要重新调整它们。
在这里,改变AsyncTask的:

 公共类德codeTask延伸的AsyncTask<弦乐,太虚,位图> {
上下文mContext;
ImageView的伏;
INT渣油;
位图位图= NULL;
INT位置;公共德codeTask(上下文的背景下,第四ImageView的,诠释RES_ID,诠释_position){
    mContext =背景;
    V = IV;
    渣油= RES_ID;
    位置= _position;
    v.setTag(本);
}保护位图doInBackground(字符串... PARAMS){  位= BitmapFactory.de codeResource(mContext.getResources(),渣油);  返回null;
}保护无效onPostExecute(位图结果){ 如果(位置< ListViewLayout.getFirstVisiblePosition()||位置> ListViewLayout.getLastVisiblePosition())
     返回; 如果(v.getTag()==这一点)
    v.setImageBitmap(位图); }

}

i´m newbie in android programming and try to implement getFilter() into my custom ArrayAdapter an filter the List by Name. I have not found any example that matches with my adapter.

Can someone help me with an example please (with my code), thx!!!

Maybe there is another possibility to filter the List?

java code:

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

Class Article

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 custom adapter:

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

        }

    }
}

    }
}

here is the code from old 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;
    }

decode Task

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

}

Error logcat:

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)

解决方案

As I found your problem interesting I made an activity with your code. The biggest problem I faced was where to get about 250 images. I first wanted to ask you but than managed to resize 306 pictures to 100x100 and put them in the drawable folder. Here is the changed getView().

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    ArticleHolder holder = new ArticleHolder();

    final Article n = articleList.get(position);

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.activity_sergej_lazy_res_listitem, null);

        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();
        DecodeTask dt1 = (DecodeTask)holder.imageViewArtikel.getTag( );
        if(dt1 != null)
          dt1.cancel(true);
      }


    holder.textViewArtikel.setText(n.getName());
    holder.textViewArtikelNummer.setText(n.getNumber());

    holder.imageViewArtikel.setImageBitmap(null);
    DecodeTask dt2 = new DecodeTask(getContext(), holder.imageViewArtikel, n.getImgID(), position ); 
    holder.imageViewArtikel.setTag(dt2);
    dt2.execute();

    return v;
}

As images of 100x100 were used there is no need to resize them. Here the changed AsyncTask:

public class DecodeTask extends AsyncTask<String, Void, Bitmap> {
Context mContext;
ImageView v;
int resId;
Bitmap bitmap = null;    
int position;

public DecodeTask(Context context, ImageView iv, int res_id, int _position ) { 
    mContext = context;
    v = iv;
    resId = res_id;
    position = _position;
    v.setTag( this); 
}

protected Bitmap doInBackground(String... params) {

  bitmap = BitmapFactory.decodeResource(mContext.getResources(), resId);

  return null;
}

protected void onPostExecute(Bitmap result) {

 if( position < ListViewLayout.getFirstVisiblePosition() || position > ListViewLayout.getLastVisiblePosition())
     return;

 if ( v.getTag() == this )
    v.setImageBitmap(bitmap);

 }

}

这篇关于实现用getFilter()。与AsyncTask的定制ArrayAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆