3

ListViewに問題があります。正確には、ImageViewが配置されています。私のアプリはYoutubeからサムネイルをダウンロードしています。その場所へのすべては大丈夫です。後で、getView()を使用しているときに、奇妙な動作が表示されます。if条件内でホルダーにデータをロードする場合:

    if(convertView == null){

convertView = mInflater.inflate(R.layout.list_item_user_video, null);
holder = new ViewHolder();  

holder.title = (TextView) convertView.findViewById(R.id.userVideoTitleTextView); 
holder.thumb = (UrlImageView) convertView.findViewById(R.id.userVideoThumbImageView);
Video video = videos.get(position);
holder.title.setText(video.getTitle());
holder.thumb.setImageDrawable(video.getThumbUrl());
                convertView.setTag(holder);
            }

私のアプリは高速ですが、ImageViewとTextViewの各ペアの位置は、高速スクロール中にシャッフルされます。一部の場合:

 Video video = videos.get(position);
                holder.title.setText(video.getTitle());
                holder.thumb.setImageDrawable(video.getThumbUrl());

if(convertView == null)の外にありますImageViewとTextViewは本来あるべき場所ですが、アプリは非常に遅いです。私はすべてをチェックしましたが、この問題を解決する方法がまったくわかりません。私たちを手伝ってくれますか?追加情報が必要な場合は、お問い合わせください。

ありがとう。

VideosActivity.java

    public class VideosAdapter extends BaseAdapter{
    // The list of videos to display
    List<Video> videos;
    // An inflator to use when creating rows
    private LayoutInflater mInflater;


    public VideosAdapter(Context context, List<Video> videos) {
        super();
        this.videos = videos;
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return videos.size();
    }

    @Override
    public Object getItem(int position) {
        return videos.get(position);
    }
@Override
    public long getItemId(int position) {
        return position;
    }



    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;          

        if(convertView == null){

            convertView = mInflater.inflate(R.layout.list_item_user_video, null);
            holder = new ViewHolder();  

            holder.title = (TextView) convertView.findViewById(R.id.userVideoTitleTextView); 
            holder.thumb = (UrlImageView) convertView.findViewById(R.id.userVideoThumbImageView);
            Video video = videos.get(position);
        holder.title.setText(video.getTitle());
        holder.thumb.setImageDrawable(video.getThumbUrl());
            convertView.setTag(holder);
        }

        else {
            holder = (ViewHolder) convertView.getTag();
        }





    return convertView;
    }
    static class ViewHolder{
        UrlImageView thumb;
        TextView title;
        Video video;
        int id;
    }
}

UrlImageView.java

  public class UrlImageView extends LinearLayout {

        private Context mContext;
        private Drawable mDrawable;
        private ProgressBar mSpinner;
        private ImageView mImage;


        public UrlImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }

        public UrlImageView(Context context) {
            super(context);
            init(context);
        }


        private void init(final Context context) {
            mContext = context;

            mImage = new ImageView(mContext);
            mImage.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            mImage.setVisibility(View.GONE);

            mSpinner = new ProgressBar(mContext);
            mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            mSpinner.setIndeterminate(true);

            addView(mSpinner);
            addView(mImage);
        }


        public void setImageDrawable(final String url) {
            mDrawable = null;
            mSpinner.setVisibility(View.VISIBLE);
            mImage.setVisibility(View.GONE);
            new Thread() {
                public void run() {
                    try {
                        mDrawable = getDrawableFromUrl(url);
                        imageLoadedHandler.sendEmptyMessage(RESULT_OK);
                    } catch (MalformedURLException e) {
                        imageLoadedHandler.sendEmptyMessage(RESULT_CANCELED);
                    } catch (IOException e) {
                        imageLoadedHandler.sendEmptyMessage(RESULT_CANCELED);
                    }

                };
            }.start();
        }


        private final Handler imageLoadedHandler = new Handler(new Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                switch (msg.what) {
                case RESULT_OK:
                    mImage.setImageDrawable(mDrawable);
                    mImage.setVisibility(View.VISIBLE);
                    mSpinner.setVisibility(View.GONE);
                    break;
                case RESULT_CANCELED:
                default:
                    // Could change image here to a 'failed' image
                    // otherwise will just keep on spinning
                    break;
                }
                return true;
            }
        });


        private static Drawable getDrawableFromUrl(final String url) throws IOException, MalformedURLException {

            return Drawable.createFromStream(((InputStream) new URL(url).getContent()), "name");
        }


    }

list_item_user_video.xml

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal" >


        <com.example.example.ui.widget.UrlImageView
            android:id="@+id/userVideoThumbImageView"
            android:layout_width="60dp"
            android:layout_height="45dp"
            android:layout_marginRight="10dp"
            android:contentDescription="YouTube video thumbnail"
            android:src="@drawable/ic_launcher"/>

        <TextView
            android:id="@+id/userVideoTitleTextView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Video Title Not Found" />

    </LinearLayout>
4

2 に答える 2

2

VideosAdapterのgetView()メソッドのif/elseから次の行を移動します

holder.title.setText(video.getTitle());
holder.thumb.setImageDrawable(video.getThumbUrl());

真上に

return convertView;
于 2013-01-04T18:23:48.353 に答える
1

既存のビューを変更していません。が null でない場合convertViewは、Android がビューをインフレートするのではなくリサイクルしていることを意味しますが、新しい値で更新する必要があります。次のようなものが機能します。

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;          

    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item_user_video, null);
        holder = new ViewHolder();  
    }

    else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.title = (TextView) convertView.findViewById(R.id.userVideoTitleTextView); 
    holder.thumb = (UrlImageView) convertView.findViewById(R.id.userVideoThumbImageView);
    Video video = videos.get(position);
    holder.title.setText(video.getTitle());
    holder.thumb.setImageDrawable(video.getThumbUrl());

    convertView.setTag(holder);

    return convertView;

}

PS Ctrl+ Shift+Fを使用して、コードを適切にフォーマットします。:)

于 2013-01-04T18:26:17.507 に答える