-1

私は2つの異なる行タイプを持つリストビューを持っています(この質問のように)。正常に動作しますが、スクロールすると非常に遅くなります。したがって、これに対抗する方法は AsyncTask を使用することだと読みました。2 つの異なる行タイプが使用されている場合、これをどのように実装できますか?

2 つの異なる AsyncTasks (doInBackground の行を膨らませる) を使用してみましたが、あらゆる種類のエラーが発生します。

getView() で:

if (convertView == null) {

            switch (type) {
            case TYPE_DAY:

                new ForecastDayTask(position, forecastHolder, convertView,
                        forecastHolder, mInflater, forecastdata).execute();

                break;
            case TYPE_DATA:
                new ForecastTask(position, forecastHolder, convertView,
                        forecastHolder, mInflater, forecastdata).execute();
                break;
            }

また、同じ AsyncTask クラスを使用して、同じデータと TYPE_DAY/TYPE_DATA を渡そうとしましたが、それは非常に複雑で、NullPointerExceptions が発生します。

何か案は?前もって感謝します!

4

1 に答える 1

0

私はこのように解決しました:

  • 可能なすべての ListItems のリストを持つ BaseAdapter を拡張しました。
  • getView は ViewHolderPattern を使用してビューをリサイクルします
  • ビューの幅は、HolderItem resp によって異なります。必要な時間に(さまざまな期間のブロードキャストを示す水平リスト)
  • GetView は、ViewHolder と DataHolder の 2 つのホルダーを受け取る AsyncTask を開始します。
  • AsyncTask は、GUIStuff、DrawRunnable を実行するスレッドの onPostExecute を開始するために必要です。
  • DrawRunnable で、背景に色を付ける方法と、ブロードキャストの期間に応じてユーザーに提示するものを決定します

タイプに応じて 2 つの異なるタスクを開始する方法が気に入っています。私の場合は、さまざまな期間の種類になります。したがって、onPostExecute で DrawBroadcastRunnable を作成するときに、どの DrawXTypeRunnable を開始するかを決定する必要があります。コード内の位置を if(XTYPE) でマークしました

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

    ViewBroadcastItemHolder viewItemHolder;
    if (convertView == null) {
        convertView = (RelativeLayout) layoutInflater.inflate(layoutId,
                parent, false);
        viewItemHolder = new ViewBroadcastItemHolder();
        viewItemHolder.logo = (ImageView) convertView
                .findViewById(R.id.broadcast_guide_image);
        viewItemHolder.time = (TextView) convertView
                .findViewById(R.id.broadcast_guide_time);
        viewItemHolder.title = (TextView) convertView
                .findViewById(R.id.broadcast_guide_title);
        viewItemHolder.divider = convertView
                .findViewById(R.id.broadcast_guide_divider);
        viewItemHolder.layout = (LinearLayout) convertView
                .findViewById(R.id.broadcast_guide_item_linear_layout);
        convertView.setTag(viewItemHolder);
    } else {
        viewItemHolder = (ViewBroadcastItemHolder) convertView.getTag();
        convertView.setVisibility(View.GONE);
    }
    BroadcastHolder broadcastItem = getItem(position);
    viewItemHolder.layout.getLayoutParams().width = broadcastItem.width;

    BroadcastHolderAsyncArgument holder = new BroadcastHolderAsyncArgument(
            convertView, viewItemHolder, broadcastItem, position);

    holder.bcViewHolder.logo
            .setImageBitmap(controller.getLogoPlaceholder());
    BroadcastHolderAsyncArgument[] argument = { holder };
    new AsyncTask<BroadcastHolderAsyncArgument, Void, BroadcastHolderAsyncArgument>() {

        @Override
        protected BroadcastHolderAsyncArgument doInBackground(
                BroadcastHolderAsyncArgument... bcHolderArg) {
            return bcHolderArg[0];
        }

        @Override
        protected void onPostExecute(
                BroadcastHolderAsyncArgument bcHolderArg) {
  // Where to put in the decision which Strategy has to get done
  //if(XTYPE){ new DrawBroadcast30ViewRunnable(..).run()}
        //else if(YTYPE){new DrawBroadcast200ViewRunnable(..).run()}
        //else if(ZTYPE){new DrawBroadcast10ViewRunnable(..).run()}
        //else{new DrawBroadcast5ViewRunnable(..).run()}

            new DrawBroadcastViewRunnable(bcHolderArg, position).run();
        }
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, argument);

    return convertView;
}

public class DrawBroadcastViewRunnable implements Runnable {

    private BroadcastHolderAsyncArgument bcAsyncArgumentHolder;
    private int position;

    public DrawBroadcastViewRunnable(
            BroadcastHolderAsyncArgument bcHolderArgument, int position) {
        super();
        this.bcAsyncArgumentHolder = bcHolderArgument;
        this.position = position;
    }

    public void run() {

        if (bcAsyncArgumentHolder.position == position) {

            // Set Background Color of CatchUp, Live and Upcomming
            if (Helper.isLiveBroadcast(
                    bcAsyncArgumentHolder.bcItemHolder.start,
                    bcAsyncArgumentHolder.bcItemHolder.stop)) {
                bcAsyncArgumentHolder.bcViewHolder.isCatchup = false;
                bcAsyncArgumentHolder.convertView
                        .setBackgroundColor(context.getResources()
                                .getColor(R.color.guide_live_broadcast));
            } else if (bcAsyncArgumentHolder.bcViewHolder.isCatchup = Helper
                    .isCatchupBroadcast(
                            bcAsyncArgumentHolder.bcItemHolder.start,
                            bcAsyncArgumentHolder.bcItemHolder.stop)) {
                bcAsyncArgumentHolder.convertView
                        .setBackgroundColor(context.getResources()
                                .getColor(R.color.guide_replay_broadcast));
            } else {
                // Upcoming Broadcast
                bcAsyncArgumentHolder.convertView
                        .setBackgroundColor(context.getResources()
                                .getColor(R.color.guide_upcoming_broadcast));
                bcAsyncArgumentHolder.bcViewHolder.isCatchup = false;
            }

            // very large layout, more than 30min
            if (bcAsyncArgumentHolder.bcItemHolder.width >= 20 * controller
                    .getPixelPerMinute()) {
                bcAsyncArgumentHolder.bcViewHolder.logo
                        .setVisibility(View.VISIBLE);
                ImageLoader.getInstance().displayImage(
                        bcAsyncArgumentHolder.bcItemHolder.imageUrl,
                        bcAsyncArgumentHolder.bcViewHolder.logo);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.time
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setText(bcAsyncArgumentHolder.bcItemHolder.title);
                bcAsyncArgumentHolder.bcViewHolder.time.setText(Helper
                        .formatBroadcastTime(
                                bcAsyncArgumentHolder.bcItemHolder.start,
                                bcAsyncArgumentHolder.bcItemHolder.stop));
            }
            // medium layout, between 20 to 15min
            if (bcAsyncArgumentHolder.bcItemHolder.width < 20 * controller
                    .getPixelPerMinute()
                    && bcAsyncArgumentHolder.bcItemHolder.width > 15 * controller
                            .getPixelPerMinute()) {
                ImageLoader.getInstance().displayImage(
                        bcAsyncArgumentHolder.bcItemHolder.imageUrl,
                        bcAsyncArgumentHolder.bcViewHolder.logo);
                bcAsyncArgumentHolder.bcViewHolder.logo
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.time
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setText(bcAsyncArgumentHolder.bcItemHolder.title);
                bcAsyncArgumentHolder.bcViewHolder.time.setText(Helper
                        .formatBroadcastTime(
                                bcAsyncArgumentHolder.bcItemHolder.start,
                                bcAsyncArgumentHolder.bcItemHolder.stop));
            }

            // medium layout, between 15 to 5min
            if (bcAsyncArgumentHolder.bcItemHolder.width <= 15 * controller
                    .getPixelPerMinute()
                    && bcAsyncArgumentHolder.bcItemHolder.width > 5 * controller
                            .getPixelPerMinute()) {
                bcAsyncArgumentHolder.bcViewHolder.logo
                        .setVisibility(View.GONE);
                bcAsyncArgumentHolder.bcViewHolder.time
                        .setVisibility(View.GONE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setVisibility(View.VISIBLE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setText(bcAsyncArgumentHolder.bcItemHolder.title);
            }

            // smal layout, to 5min
            if (bcAsyncArgumentHolder.bcItemHolder.width <= 5 * controller
                    .getPixelPerMinute()) {
                bcAsyncArgumentHolder.bcViewHolder.logo
                        .setVisibility(View.GONE);
                bcAsyncArgumentHolder.bcViewHolder.time
                        .setVisibility(View.GONE);
                bcAsyncArgumentHolder.bcViewHolder.title
                        .setVisibility(View.GONE);
            }

            if (bcAsyncArgumentHolder.bcItemHolder.dummy) {
                bcAsyncArgumentHolder.bcViewHolder.divider
                        .setVisibility(View.GONE);
            } else {
                bcAsyncArgumentHolder.bcViewHolder.divider
                        .setVisibility(View.VISIBLE);
            }

            if (!bcAsyncArgumentHolder.bcItemHolder.id.equalsIgnoreCase("")) {
                bcAsyncArgumentHolder.bcViewHolder.broadcastId = Long
                        .parseLong(bcAsyncArgumentHolder.bcItemHolder.id);
            }
            bcAsyncArgumentHolder.convertView.setVisibility(View.VISIBLE);
        }
    }

それで、あなたはどのようにあなたの問題を解決しましたか?私の解決策には問題が残っています.viewRecyclingによってビューが混乱し、40分のレイアウトではなく5分のレイアウトがレンダリングされます.高速にスクロールすると同時実行性があるためです. なぜそうなのかはわかっていますが、修正方法はまだわかりません:-D

于 2013-07-09T08:15:28.587 に答える