Android Media Player を作成しています。動画ファイルのサムネイル画像を含む画像を持つカスタム リスト ビューを作成したいと考えています。サムネイル画像は、このリスト ビューのファイル名に従って表示され、特定のリンクから表示される必要があります。
助けてくれてありがとう。
Android Media Player を作成しています。動画ファイルのサムネイル画像を含む画像を持つカスタム リスト ビューを作成したいと考えています。サムネイル画像は、このリスト ビューのファイル名に従って表示され、特定のリンクから表示される必要があります。
助けてくれてありがとう。
この目的のためにカスタム アダプタを使用するのが賢明です。次に、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 を操作するプロセス全体が合理化されます。
カスタム アダプターを備えたカスタム リストビューが必要になります。
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 開発者によるリストビューに関する講演です。