2

この例のListAdapterを使用します。

http://code.google.com/p/au-optimizing-layouts-201/source/browse/au_optimizinglayouts/src/com/example/android/training/optimizinglayouts/OptimizedListAdapter.java?r=4

リスト内の要素は、スクロールの速度に応じて数回描画されるため、この例はあまり良くありません。それは1つだけの再利用のためです

private FakeImageLoader mFakeImageLoader;

FakeImageLoader.java getImage()が実際の画像をロードする場合。この例を実行してパフォーマンスを維持するには、何をする必要がありますか?

public class OptimizedListAdapter extends BaseAdapter{

        ...
        private FakeImageLoader mFakeImageLoader;

public OptimizedListAdapter(Context cxt)
        {
                // Cache the LayoutInflate to avoid asking for a new one each time.
                mLayoutInflater = LayoutInflater.from(cxt);
                mFakeImageLoader = new FakeImageLoader(cxt);
                ...

 public View getView(final int position, View convertView, ViewGroup parent)
        {
        // A ViewHolder keeps references to children views to avoid unneccessary calls
        // to findViewById() on each row.
        ViewHolder holder;

                // When convertView is not null, we can reuse it directly, there is no need
        // to reinflate it. We only inflate a new View when the convertView supplied
        // by ListView is null.
                if(convertView==null)
                {
                        convertView = mLayoutInflater.inflate(R.layout.listitem, null);

                        // Creates a ViewHolder and store references to the two children views
            // we want to bind data to.
            holder = new ViewHolder();
            holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
            holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
            holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
            convertView.setTag(holder);
                }else
                {
                        holder = (ViewHolder) convertView.getTag();
                }

                //holder.icon.setImageDrawable(drawable);
                holder.text.setText(new StringBuffer(ITEM_PRE_TEXT).append(position));
                holder.timestamp.setText(""+(System.currentTimeMillis()-START_TIMESTAMP));
        holder.position = position;

        //during a fast scroll this could start 100's of threads, need a thread pool processing them!
        //see previous ImageLoader.
                new AsyncTask<ViewHolder, Void, Bitmap>() {
                        private ViewHolder v;

                        @Override
                        protected Bitmap doInBackground(ViewHolder... params) {
                                v = params[0];
                                return mFakeImageLoader.getImage();
                        }

                        @Override
                        protected void onPostExecute(Bitmap result) {
                                super.onPostExecute(result);
                                if(v.position == position)
                                {
                                        v.icon.setImageBitmap(result);
                                }
                        }

                  }.execute(holder);
                  //holder.icon.setImageBitmap(mFakeImageLoader.getImage());

                return convertView;
        }

ありがとうタタ

4

2 に答える 2

1

このユニバーサル イメージ ローダー ライブラリユニバーサル イメージ ローダー ライブラリを 1 つのアプリで使用して画像をダウンロードしましたが、私にとってはより便利です。

于 2013-01-28T18:46:28.790 に答える
0

これは、遅延読み込みに使用するものです。このコードは変更され ( xD を見る必要のないものは削除されています)、テストされていないことに注意してください。アイデアを共有するためだけです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public final class ResultsAdapter
        extends BaseAdapter
{

    // this is used for runnint on UI thread, as View.post did not always executed for me
    private Activity host;
    private ExecutorService service;

    public ResultsAdapter(Activity host)
    {
        this.host = host;
    }

    /**
     *  Set new data to this adapter. Or if your data will not change, you can do this in constructor
     */
    public void refresh(List<MyClass> data)
    {
        if (this.service != null) {
            this.service.shutdownNow();
        }

        this.data = data;

        this.service = Executors.newSingleThreadExecutor();
        this.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ...
        MyClass item = items.get(position);
        holder.image.setTag(Long.valueOf(item.getId()));
         try {
            this.service.submit(new Job(current.getImageURL(), h.logo, Long.valueOf(item.getId())));
        } catch (Throwable e) {
        }
        ...

    }


    private final class Job
            implements Runnable
    {

        private final ImageView logo;
        private final Long logoTag;
        private final String URL;

        private Job(String url; ImageView logo, Long logoTag)
        {
            this.URL = url;
            this.logo = logo;
            this.logoTag = logoTag;
        }

        @Override
        public void run()
        {
            Thread t = Thread.currentThread();
            t.setPriority(Thread.NORM_PRIORITY - 1); //not to load ui thread much
            ...
            //load my stuff
            ...
            // logo tag could change during scrolling. getView could be called for the same reused view, so we check if we are not currently setting old data.
            if (logo.getTag().equals(logoTag)) {
                host.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        logo.setImageBitmap(myStuff);
                    }
                }
            });
        }
    }
}

しかし、高速スクロール中に一部のデータが変更されることがあります。これにより、あなたのものよりも目立たなくなるかどうか教えてください。

于 2013-01-29T09:18:30.687 に答える