Android Jamendo开源在线音乐播放器源码分析八 Adapter的分析

刘奇
2023-12-01

在项目的代码中有一个包com.teleca.jamendo.adapter专门存放使用到的所有Adapter,这样确实方便管理,当然代码里面最好的还是这些Adapter的集成关系,是代码清晰而且容易复用。所有的Adapter都是集成自这个抽象的自定义的ArrayListAdapter

/**
 * Nice wrapper-abstraction around ArrayList
 * 
 * @author Lukasz Wisniewski
 *
 * @param <T>
 */
public abstract class ArrayListAdapter<T> extends BaseAdapter{
	
	protected ArrayList<T> mList;
	protected Activity mContext;
	protected ListView mListView;
	
	public ArrayListAdapter(Activity context){
		this.mContext = context;
	}

	@Override
	public int getCount() {
		if(mList != null)
			return mList.size();
		else
			return 0;
	}

	@Override
	public Object getItem(int position) {
		return mList == null ? null : mList.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	abstract public View getView(int position, View convertView, ViewGroup parent);
	
	public void setList(ArrayList<T> list){
		this.mList = list;
		notifyDataSetChanged();
	}
	
	public ArrayList<T> getList(){
		return mList;
	}
	
	public void setList(T[] list){
		ArrayList<T> arrayList = new ArrayList<T>(list.length);  
		for (T t : list) {  
			arrayList.add(t);  
		}  
		setList(arrayList);
	}
	
	public ListView getListView(){
		return mListView;
	}
	
	public void setListView(ListView listView){
		mListView = listView;
	}

}
正如作者所说Nice wrapper-abstraction around ArrayList很好的封装了ArrayList的抽象类

/**
 * Adapter representing albums
 * 
 * @author Lukasz Wisniewski
 */
public class AlbumAdapter extends ArrayListAdapter<Album> {
	
	public AlbumAdapter(Activity context) {
		super(context);
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View row=convertView;

		ViewHolder holder;

		if (row==null) {
			LayoutInflater inflater = mContext.getLayoutInflater();
			row=inflater.inflate(R.layout.album_row, null);

			holder = new ViewHolder();
			holder.image = (RemoteImageView)row.findViewById(R.id.AlbumRowImageView);
			holder.albumText = (TextView)row.findViewById(R.id.AlbumRowAlbumTextView);
			holder.artistText = (TextView)row.findViewById(R.id.AlbumRowArtistTextView);
			holder.progressBar = (ProgressBar)row.findViewById(R.id.AlbumRowRatingBar);

			row.setTag(holder);
		}
		else{
			holder = (ViewHolder) row.getTag();
		}
		
		holder.image.setDefaultImage(R.drawable.no_cd);
		holder.image.setImageUrl(mList.get(position).getImage(),position, getListView());
		holder.albumText.setText(mList.get(position).getName());
		holder.artistText.setText(mList.get(position).getArtistName());
		holder.progressBar.setMax(10);
		holder.progressBar.setProgress((int) (mList.get(position).getRating()*10));

		return row;
	}
	
	/**
	 * Class implementing holder pattern,
	 * performance boost
	 * 
	 * @author Lukasz Wisniewski
	 */
	static class ViewHolder {
		RemoteImageView image;
		TextView albumText;
		TextView artistText;
		ProgressBar progressBar;
	}
}
当使用时:

AlbumAdapter albumAdapter = new AlbumAdapter(SearchActivity.this); 
albumAdapter.setList(albums);
albumAdapter.setListView(mSearchListView);
也就是设置父类里面的三个属性的值

protected ArrayList<T> mList;
protected Activity mContext;
protected ListView mListView;

备注:ProgressBar的一点新的发现

holder.progressBar.setMax(10);
holder.progressBar.setProgress((int) (mList.get(position).getRating()*10));

原来ProgressBar可以当rating来使用

 类似资料: