自定义一个适配器

本文详细介绍了如何在Android中自定义一个适配器,通过继承BaseAdapter类,实现ListView或其他视图的数据绑定和显示。适配器是连接数据源和UI组件的关键,使得数据能够正确地展示在界面上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义一个适配器extends BaseAdapter

public class MusicAdapter extends BaseAdapter{

2.添加相应的属性

private LayoutInflater mInflater;
	private Context mContext;
	private int mResouce;
	private List<Music> mObjects;

3.重写BaseAdapter中的方法

public MusicAdapter(Context context,int resource,List<Music> musics) {
	   mContext=context;
	   //获得一个一个系统服务(此服务对应的对象可以解析xml,并通过反射构建xml对应的元素对象)
	   mInflater=(LayoutInflater) 
	   mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	   mResouce=resource;
	   mObjects=musics;
	}
	/**返回数据集中item数据的个数*/
	@Override
	public int getCount() {//重要
		return mObjects.size();
	}
	/**返回对应位置的item中的数据*/
	@Override
	public Object getItem(int position) {
		return mObjects.get(position);
	}
	/**暂且直接返回position*/
	@Override
	public long getItemId(int position) {
		return position;
	}
	/**此方法用于构建item,每显示一个item都要执行一次此方法*/
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {//重要
		Log.i("TAG", "convertView="+convertView);
		Log.i("TAG", "parent="+parent);
		//1.item view (饺子皮,饺子皮的样子由mResouce决定)
	    View v=null;
	    ViewHolder vHolder=null;
	    if(convertView==null){//页面启动时初始值为空
		//inflate方法返回的类型由mResouce资源文件的根元素决定
		//1)根据资源id找到对应的xml布局资源
		//2)底层会借助pull解析解析xml资源
		//3)底层会通过反射构建xml资源中的元素对象
		//4)inflate方法的返回值为mResource资源文件的根元素对象
		v=mInflater.inflate(mResouce,parent,false);
		vHolder=new ViewHolder();
		vHolder.sectionTv=(TextView) v.findViewById(R.id.sectionId);
		vHolder.titleTv=(TextView) v.findViewById(android.R.id.text1);;
		vHolder.createTv=(TextView) v.findViewById(android.R.id.text2);;
		v.setTag(vHolder);//建立关联:相当于一个教室一个座位表
	    }else{
		v=convertView;//可重用的item view对象
		vHolder=(ViewHolder) v.getTag();
		}
		//2.item data (饺子馅)
		Music m=mObjects.get(position);
		//3.bind view (包饺子,对号入座,将饺子馅放到饺子皮上)
		vHolder.sectionTv.setText(m.getTitle().substring(0, 1).toUpperCase());
		vHolder.titleTv.setText(m.getTitle());
		vHolder.createTv.setText(m.getCreated());
		//4.设置item view背景(根据选中位置的不同进行设置)
		int checked=((ListView)parent).
				getCheckedItemPosition();
		Log.i("TAG", "checked="+checked);
		if(position==checked){
			v.setBackgroundColor(Color.YELLOW);
		}else{
			v.setBackgroundColor(Color.WHITE);
		}
		//5.显示或隐藏item对应的section
		int section=getSectionForPosition(position);
		int minPos=getPositionForSection(section);
		if(position==minPos){
		vHolder.sectionTv.setVisibility(View.VISIBLE);
		}else{
	    vHolder.sectionTv.setVisibility(View.GONE);
		}
		return v;//包好的饺子
	}
4.里面有引用的其他部分的方法或者类

/**通过此方法获得每个位置的section的ascii值*/
	public int getSectionForPosition(int position){
		return mObjects.get(position).
		getTitle().toUpperCase().charAt(0);
	}
	/***通过此方法获得section在列表中的最小位置*/
	public int getPositionForSection(int section){
		//1.遍历所有位置(0~getCount()-1)
		for(int i=0;i<getCount();i++){
		 int findSec=getSectionForPosition(i);
		 if(findSec==section){
		//2.找到最小位置
			 return i;
		 }
		}
		return -1;
	}
	
	class ViewHolder{
		TextView sectionTv;
		TextView titleTv;
		TextView createTv;
	}



在Android开发中,自定义适配器(Adapter)用于将数据绑定到视图组件上,如RecyclerView、ListView等,使得数据可以按照特定的方式展示。以下是自定义一个基础适配器的基本步骤: 1. 创建一个继承自`BaseAdapter`或`RecyclerView.Adapter`的类,取决于使用的列表视图。如果使用的是RecyclerView,建议继承`RecyclerView.Adapter`,因为它提供了更好的性能优化。 ```java public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { // 数据列表 private List<String> dataList; // ViewHolder 类,用于存储每个item的视图引用 static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ViewHolder(TextView textView) { super(textView); this.textView = textView; } } // 构造函数传入数据列表 public CustomAdapter(List<String> dataList) { this.dataList = dataList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(itemView.findViewById(R.id.text_view)); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { String data = dataList.get(position); holder.textView.setText(data); } @Override public int getItemCount() { return dataList.size(); } } ``` 这里我们创建了一个ViewHolder类,用于复用视图,避免每次都重新创建。`onCreateViewHolder`负责从布局文件中 inflate 并返回一个ViewHolder实例,`onBindViewHolder`负责填充数据,`getItemCount`返回数据的数量。 2. 将适配器与你的列表视图关联起来: ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(context)); // 设置布局管理器 recyclerView.setAdapter(new CustomAdapter(yourDataList)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值