1

やあみんな私はビューホルダー+ベースアダプターを持っていますが、それは機能していません

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    ViewHolder holder;
    // get the selected entry
    AI entry = (AI) mListAppInfo.get(position);

    // inflate new layout if null
    if(v == null) {           
        holder = new ViewHolder();
        v = inflater.inflate(R.layout.list, null);

        holder.position = position;
        holder.title = (TextView)v.findViewById(R.id.tvName);
        holder.icon = (ImageView)v.findViewById(R.id.ivIcon);
        holder.iconimg = entry.icon;

        new ThumbnailTask(position, holder)
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

        v.setTag(holder);   
    }else{
        holder = (ViewHolder) v.getTag();
    }

    holder.title.setText(entry.title);

    // return view
    return v;
}

リストの項目は、私が間違っていることを何も示していませんか?

編集これがクラス全体です

public class AIAdapter extends BaseAdapter {
    private Context mContext;
    private List<?> mListAppInfo;
    private LayoutInflater inflater;

    public AIAdapter(Context c, List<?> list, PackageManager pm) {
        mContext = c;
        mListAppInfo = list;
        inflater = LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        return mListAppInfo.size();
    }

    @Override
    public Object getItem(int position) {
        return mListAppInfo.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressWarnings("null")
    @Override
    public View getView(int position, View v, ViewGroup parent) {
        ViewHolder holder;
        // get the selected entry
        AI entry = (AI) mListAppInfo.get(position);

        // inflate new layout if null
        if(v == null) {           
            holder = new ViewHolder();
            v = inflater.inflate(R.layout.list, null);

            holder.position = position;
            holder.title = (TextView)v.findViewById(R.id.tvName);
            holder.icon = (ImageView)v.findViewById(R.id.ivIcon);
            holder.iconimg = entry.icon;

            new ThumbnailTask(position, holder)
            .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

            v.setTag(holder);   
        }else{
            holder = (ViewHolder) v.getTag();
        }

        holder.title.setText(entry.title);

        // return view
        return v;
    }

    @SuppressWarnings("rawtypes")
    private static class ThumbnailTask extends AsyncTask{
        private int mPosition;
        private ViewHolder mHolder;
        private Rect mOldBounds = new Rect();

        public ThumbnailTask(int position, ViewHolder holder) {
            mPosition = position;
            mHolder = holder;
        }

        @Override
        protected Drawable doInBackground(Object... arg0) {
            Drawable icon = mHolder.iconimg;

            int width = 64;
            int height = 64;

            final int iconWidth = icon.getIntrinsicWidth();
            final int iconHeight = icon.getIntrinsicHeight();

            if (icon instanceof PaintDrawable) {
                PaintDrawable painter = (PaintDrawable) icon;
                painter.setIntrinsicWidth(width);
                painter.setIntrinsicHeight(height);
            }

            if (width > 0 && height > 0 && (width < iconWidth || height < iconHeight)) {
                final float ratio = (float) iconWidth / iconHeight;

                if (iconWidth > iconHeight) {
                    height = (int) (width / ratio);
                } else if (iconHeight > iconWidth) {
                    width = (int) (height * ratio);
                }

                final Bitmap.Config c =
                        icon.getOpacity() != PixelFormat.OPAQUE ?
                            Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
                final Bitmap thumb = Bitmap.createBitmap(width, height, c);
                final Canvas canvas = new Canvas(thumb);
                canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, 0));
                mOldBounds.set(icon.getBounds());
                icon.setBounds(0, 0, width, height);
                icon.draw(canvas);
                icon.setBounds(mOldBounds);
                icon = new BitmapDrawable(thumb);
            }

            return icon;
        }

        protected void onPostExecute(Drawable bitmap) {
            if (mHolder.position == mPosition) {
                mHolder.icon.setImageDrawable(bitmap);
            }
        }

    }
}

class ViewHolder{
    public int position;
    public TextView title;
    public ImageView icon;
    public Drawable iconimg;
}

何が間違っているのかわかりません。すべてのentry.titleとentry.iconにはデータがあります。リストビューには何も表示されていませんが。レイアウトリストには、imageviewとtextviewがあります。これはビューホルダーなしで機能しますが、ビューホルダーを追加すると機能しません

4

2 に答える 2

2

まず、「v」オブジェクトを作成する必要はありません。convertView を直接使用できます。BaseAdapter クラスを正しくオーバーライドしましたか? たとえば、getCount() メソッドは ... mListAppInfo.size() を返しますか?

一見すると、メソッドは機能するはずです。クラス全体をコピーして貼り付けていただけませんか?

于 2012-12-11T18:36:41.983 に答える
1

viewHolder パターンを適用する場合、ViewHolder クラスは静的である必要があります。

少し話題から外れましたが、かなり頻繁に発行する asynctasks には注意する必要があります。スレッド プールの使用を検討することをお勧めします。同様に、アダプター内のアイテムのリストの代わりに SparseArray または HashMap を検討してみてください。リストよりも特定のインデックスでアイテムを取得する方が高速です。

この行にブレークポイントを設定してみてください: " holder.title.setText(entry.title);" それはそこに着きますか?すべての情報は正しいですか?

于 2012-12-11T19:29:39.560 に答える