0

こんにちは私のアプリは、xmlファイルを解析してから、URLから画像を読み込み、テキストも読み込んでリストビューに表示しますが、URLから画像を読み込んでいて、リストビューを少し下にスクロールしている間は、画像を読み込めません。適切に、それはアプリを強制的に閉じます。今、状況を克服する方法。ここで、URLから画像をダウンロードするための私のコードとテキストを手伝ってください。

public class NewsRowAdapter extends ArrayAdapter<Item> 
{
    LoadingImage loadingImage;
    Bitmap bitmap = null;
    private Activity activity;
    private List<Item> items;
    private Item objBean;
    private int row;
    /*private DisplayImageOptions options;
    ImageLoader imageLoader;*/

    public NewsRowAdapter(Activity act, int resource, List<Item> arrayList) 
    {
        super(act, resource, arrayList);
        this.activity = act;
        this.row = resource;
        this.items = arrayList;

        /*options = new DisplayImageOptions.Builder().showStubImage(R.drawable.blank).showImageForEmptyUrl(R.drawable.blank).cacheInMemory().cacheOnDisc().build();
        imageLoader = ImageLoader.getInstance();*/


    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        ViewHolder holder;
        if (view == null) 
        {
            LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(row, null);

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

        if ((items == null) || ((position + 1) > items.size()))
            return view;

        objBean = items.get(position);

        holder.tvTitle = (TextView) view.findViewById(R.id.tvtitle);
        holder.tvDesc = (TextView) view.findViewById(R.id.tvdesc);
        holder.tvDate = (TextView) view.findViewById(R.id.tvdate);
        holder.imgView = (ImageView) view.findViewById(R.id.image);
        holder.pbar = (ProgressBar) view.findViewById(R.id.pbar);

        if (holder.tvTitle != null && null != objBean.getTitle() && objBean.getTitle().trim().length() > 0) 
        {
            holder.tvTitle.setText(Html.fromHtml(objBean.getTitle()));
        }
        if (holder.tvDesc != null && null != objBean.getDesc()
                && objBean.getDesc().trim().length() > 0) {
            holder.tvDesc.setText(Html.fromHtml(objBean.getDesc()));
        }
        if (holder.tvDate != null && null != objBean.getPubdate() && objBean.getPubdate().trim().length() > 0)
        {
            holder.tvDate.setText(Html.fromHtml(objBean.getPubdate()));
        }
        if (holder.imgView != null) 
        {
            if (null != objBean.getLink() && objBean.getLink().trim().length() > 0) 
            {
                final ProgressBar pbar = holder.pbar;
                pbar.setVisibility(View.INVISIBLE);
                //---------CHANGES MADE FOR LOADING IMAGE----------//
                Log.d("IMAGE NULL----------", objBean.getLink());


                try 
                {

                    URL linkurl = new URL(objBean.getLink());

                    bitmap = BitmapFactory.decodeStream(linkurl.openConnection().getInputStream());

                    holder.imgView.setImageBitmap(bitmap);

                } catch (MalformedURLException e) 
                {
                    e.printStackTrace();

                } catch (IOException e) 
                {
                    e.printStackTrace();
                }


                /*try 
                {
                    loadBitmap(objBean.getLink());

                } catch (IOException e) 
                {
                    e.printStackTrace();
                }
                */

                /*imageLoader.init(ImageLoaderConfiguration.createDefault(activity));
                imageLoader.displayImage(objBean.getLink(), holder.imgView, options, new ImageLoadingListener()
                {
                            @Override
                            public void onLoadingComplete() 
                            {
                                pbar.setVisibility(View.INVISIBLE);

                            }

                            @Override
                            public void onLoadingFailed() 
                            {
                                pbar.setVisibility(View.INVISIBLE);
                            }

                            @Override
                            public void onLoadingStarted()
                            {
                                pbar.setVisibility(View.VISIBLE);

                            }
                });*/

            } else 
            {
                holder.imgView.setImageResource(R.drawable.ic_launcher);
            }
        }

        return view;
    }





    public class ViewHolder
    {

        public TextView tvTitle, tvDesc, tvDate;
        private ImageView imgView;
        private ProgressBar pbar;

    }

} 
4

2 に答える 2

1

画像のダウンロードには AsyncTask を使用します。これを確認してください:http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html

于 2013-02-07T10:31:25.990 に答える
0

UI スレッドでネットワーク操作を実行しています。ジョブに対して AsyncTask do を作成してみてください。とても簡単です。コードを移動するだけです。

アダプターでこれを使用しているため、アイテムのリストを作成することになるため、これを調べてください。listviews getView の問題に関する定期的な問題を回避したいので。

URL を画像にロードするのに役立つオープン ソース ライブラリもあります。たとえば、Koush の UrlImageViewHelperは、これを非常にうまく行うのに役立ちます。アダプターから次のように呼び出します。

        if (holder.imgView != null) {
        if (null != objBean.getLink() && objBean.getLink().trim().length() > 0) {
            final ProgressBar pbar = holder.pbar;
            pbar.setVisibility(View.INVISIBLE);
            //---------CHANGES MADE FOR LOADING IMAGE----------//
            Log.d("IMAGE NULL----------", objBean.getLink());

            String linkurl = new URL(objBean.getLink().toString());
            UrlImageViewHelper.setUrlDrawable(holder.imgView, linkurl, R.id.your_default_drawable);

        }
于 2013-02-07T10:31:55.843 に答える