1

私は Android 開発にうんざりしており、OnCreate 中に Twitter から解析されたテキストと画像をリストビューに入力しようとしています。問題なくリストビューにデータを入力できますが、リストビューはスムーズではなくぎくしゃくスクロールします。最初はエミュレータの問題だと思っていましたが、私のデバイスでもぎくしゃくしています。とてもイライラするのは、スタックオーバーフローのすべてのチュートリアルと投稿が推奨するビューホルダーアプローチを使用していることです。どんな助けでも大歓迎です。これが私のコードです...

 public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.listitem, null);
          ViewHolder holder = new ViewHolder();          
          holder.username = (TextView) v.findViewById(R.id.username);        
          holder.message = (TextView) v.findViewById(R.id.message);
          holder.image = (ImageView) v.findViewById(R.id.avatar);
          v.setTag(holder);

    }

    Tweet tweet = tweets.get(position);
    if (tweet != null) {
        ViewHolder holder = (ViewHolder)v.getTag();
        holder.username = (TextView) v.findViewById(R.id.username);
        holder.message = (TextView) v.findViewById(R.id.message);
        holder.image = (ImageView) v.findViewById(R.id.avatar);

        if (holder.username != null) {
            holder.username.setText(tweet.username);
        }

        if(holder.message != null) {
            holder.message.setText(tweet.message);
        }

        if(holder.image != null) {
            holder.image.setImageBitmap(getBitmap(tweet.image_url));

        }
    }
    return v;
}
}

static class ViewHolder {
        TextView username;  
        TextView message;
        ImageView image;
    }

public Bitmap getBitmap(String bitmapUrl) {
    try {
        URL url = new URL(bitmapUrl);
        return BitmapFactory.decodeStream(url.openConnection() .getInputStream()); 
    }
    catch(Exception ex) {return null;}
}
4

1 に答える 1

3

getBitmap メソッドは、UI スレッドで画像をダウンロードしてデコードしています。これにより、スクロールが大幅に一時停止し、以降のバージョンの Android でクラッシュが発生します。

ビットマップ処理に関する開発者ガイドには、ビットマップを非同期的にロードするための実装がかなり簡単な手法が含まれています。

于 2012-09-16T22:56:08.383 に答える