0

Android Media Player を作成しています。動画ファイルのサムネイル画像を含む画像を持つカスタム リスト ビューを作成したいと考えています。サムネイル画像は、このリスト ビューのファイル名に従って表示され、特定のリンクから表示される必要があります。

助けてくれてありがとう。

4

2 に答える 2

2

この目的のためにカスタム アダプタを使用するのが賢明です。次に、getView メソッドをオーバーライドしてレイアウトを構築します。ViewHolder デザイン パターンを使用し、画像を非同期的に読み込む私のプロジェクトの 1 つの例を次に示します。

   package com.suterastudio.aca.gui.adapters;

import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.AsyncTask;
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 com.suterastudio.aca.R;
import com.suterastudio.aca.data.Tweet;
import com.suterastudio.aca.data.UserProgramme;
import com.suterastudio.aca.gui.images.LinkToBitmap;

public class TweetsAdapter extends ArrayAdapter<UserProgramme> {
    private static List<Tweet> Tweets;

    public TweetsAdapter(Context context, int textViewResourceId,
            List<Tweet> tweets) {
        super(context, textViewResourceId);
        Tweets = tweets;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Tweet thisTweet = Tweets.get(position);
        ViewHolder holder;
        // Inflate the view if it is null
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_tweets_row, null);
            holder = new ViewHolder();
            holder.profilePic = (ImageView) convertView
                    .findViewById(R.id.img_picture);
            holder.userName = (TextView) convertView
                    .findViewById(R.id.txt_name);
            holder.text = (TextView) convertView.findViewById(R.id.txt_content);
            holder.position = position;
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // Make sure we've got an actual event, here
        if (thisTweet != null) {
            // Additional null exception swaddling
            if (holder.profilePic != null && holder.userName != null
                    && holder.text != null) {
                try {
                    if (thisTweet.profile_image_url != null) {
                        new ThumbnailTask(position, holder, thisTweet)
                        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
                    }
                    if (thisTweet.from_user_name != null) {
                        holder.userName.setText(thisTweet.from_user_name);
                    }
                    if (thisTweet.text != null) {
                        holder.text.setText(thisTweet.text);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        return convertView;
    }

    private static class ThumbnailTask extends AsyncTask {
        private int mPosition;
        private ViewHolder mHolder;
        private Tweet mTweet;

        public ThumbnailTask(int position, ViewHolder holder, Tweet thisTweet) {
            mPosition = position;
            mHolder = holder;
            mTweet = thisTweet;
        }

        @Override
        protected void onPostExecute(Object result) {
            if (mHolder.position == mPosition) {
                mHolder.profilePic.setImageBitmap((Bitmap) result);
            }
        }

        @Override
        protected Object doInBackground(Object... params) {
            LinkToBitmap linkToBitmap = new LinkToBitmap(
                    mTweet.profile_image_url);
            Bitmap userIconBitmap = linkToBitmap.getRemoteImage();
            return userIconBitmap;
        }
    }

    private static class ViewHolder {
        public TextView text;
        public TextView userName;
        public ImageView profilePic;
        public int position;
    }

}

次に、親アクティビティまたはフラグメントで、アダプターをアタッチするだけです。このようなもの:

        LvMenu = (ListView) mView.findViewById(R.id.listViewTweets);
    TAdapter.notifyDataSetChanged();
    LvMenu.setAdapter(TAdapter);

アダプターを使用すると、パフォーマンスが向上するだけではありません。データ ドリブン ビュー、特に ListViews を操作するプロセス全体が合理化されます。

于 2013-05-01T11:15:40.340 に答える
1

カスタム アダプターを備えたカスタム リストビューが必要になります。

    ListView lv= (ListView) findViewById(R.id.lv);
    CustomAdapter cus = new CustomAdapter(this);
    lv.setAdapter(cus);

CustomAdapter クラス

class CustomAdapter extends BaseAdapter
    {
      public CustomAdapter(CustomListView customListView) {
    super(customListView, 0);
    // TODO Auto-generated constructor stub
    this.mInflater = LayoutInflater.from(customListView);  
    c=customListView;
}
public int getCount() {
    return 20;    //listview item count
}

public Object getItem(int arg0) {
    return arg0;
}

public long getItemId(int arg0) {
return arg0;
}

public View getView(final int arg0, View arg1, ViewGroup arg2) {  

            //Inflate a custom layout           

    return arg1;
}


    }     

作業例 @ http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/

スムーズなスクロールとパフォーマンスのために、カスタム アダプターと共に ViewHolder を使用する必要があります。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

これは、Google 開発者によるリストビューに関する講演です。

http://www.youtube.com/watch?v=wDBM6wVEO70&noredirect=1

于 2013-05-01T11:17:04.707 に答える