0

そこにListViewのカスタムアダプターがあり、ビットマップをダウンロードするスレッドがあります。ビットマップがロードされたときにリストビューに表示されないため、うまく機能しません。見たい場合は、リストをスクロールする必要があります。

したがって、問題は、ビューを強制的に再生成する方法です。そして、その実現には多くの行き詰まりがあります。それは変更可能ですか?

私のコードがあります:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.IOException;
import java.net.URL;
import java.util.List;

public class Adapter extends ArrayAdapter<Place> {
    private Activity mActivity;
    private List<Place> mList;


    public Adapter(Activity context, List<Place> objects) {
        super(context, R.layout.row, objects);
        mActivity = context;
        mList = objects;
    }

    static class ViewHolder {
        private TextView mTextViewName;
        private TextView mTextViewAddress;
        private TextView mTextViewWeb;
        private ImageView mImageButtonPhoto;
    }
    ViewHolder viewHolder;
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflator = mActivity.getLayoutInflater();
            convertView = inflator.inflate(R.layout.row, null);
            viewHolder = new ViewHolder();
            viewHolder.mTextViewName = (TextView) convertView.findViewById(R.id.textView1);
            viewHolder.mTextViewAddress = (TextView) convertView.findViewById(R.id.textView2);
            viewHolder.mTextViewWeb = (TextView) convertView.findViewById(R.id.textView3);
            viewHolder.mImageButtonPhoto = (ImageView) convertView.findViewById(R.id.imageButton1);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.mTextViewName.setText(mList.get(position).getName());
        viewHolder.mTextViewAddress.setText(mList.get(position).getAddress());
        viewHolder.mTextViewWeb.setText(mList.get(position).getUrl().toString());
        viewHolder.mTextViewWeb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(mList.get(position).getUrl().toString()));
                mActivity.startActivity(i);
            }
        });
        URL url = mList.get(position).getPhoto_url();
        final URL finalUrl = url;
        new Thread(new Runnable() {
            public void run() {
                final Bitmap b;
                try {
                    b = BitmapFactory.decodeStream(finalUrl.openConnection().getInputStream());
                    viewHolder.mImageButtonPhoto.post(new Runnable() {
                        public void run() {
                            viewHolder.mImageButtonPhoto.setImageBitmap(b);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return convertView;
    }

}
4

1 に答える 1

2

notifyDataSetChanged()データを渡した後、アダプターを呼び出してみましたか?

invalidate()各アイテムのを呼び出し、View再描画させます。

編集:気にしないで、メソッドを使用する必要がありますadd(item)

データを更新する準備ができたら、forループを実行します。

for (int i = 0; i < mList.getCount(); i++) {
    adapter.add(mList.getItem(i));
}
于 2012-07-26T20:33:45.137 に答える