Android自定义Adapter如何根据当前运行的Activity动态切换布局文件
解决方案
不要在Adapter内部硬编码判断所属Activity类型,这种实现方式会导致代码耦合度过高,后续新增场景使用该Adapter时必须修改Adapter内部逻辑,可维护性和扩展性都很差。更合理的实现方式是将布局资源ID作为参数传入Adapter构造函数,完全解耦Adapter和具体Activity的绑定关系。
修改后的Adapter代码
package com.example.placesofinterest; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import java.util.ArrayList; public class GridAdapter extends BaseAdapter { private Context context; private LayoutInflater inflater; private ArrayList<Bitmap> img; // 新增成员变量存储传入的布局ID private int mLayoutResId; // 构造方法新增布局ID参数 public GridAdapter(Context c, ArrayList<Bitmap> img, int layoutResId){ this.context = c; this.img = img; this.mLayoutResId = layoutResId; } @Override public int getCount() { return img.size(); } @Override public Object getItem(int position) { return img.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { inflater = LayoutInflater.from(context); // 直接使用传入的布局ID加载 convertView = inflater.inflate(mLayoutResId, parent, false); MyViewHolder myViewHolder = new MyViewHolder(convertView); convertView.setTag(myViewHolder); } MyViewHolder myViewHolder = (MyViewHolder)convertView.getTag(); myViewHolder.img.setImageBitmap(img.get(position)); return convertView; } public class MyViewHolder { public ImageView img; public MyViewHolder(View view) { // 只要两个布局内的ImageView ID都为R.id.imageView就不需要额外修改 img = view.findViewById(R.id.imageView); } } }
不同Activity中调用方式
- MainActivity1中初始化Adapter:
GridAdapter adapter = new GridAdapter(MainActivity1.this, 图片Bitmap列表, R.layout.row_layout); gridView.setAdapter(adapter);
- MainActivity2中初始化Adapter:
GridAdapter adapter = new GridAdapter(MainActivity2.this, 图片Bitmap列表, R.layout.row_layout2); gridView.setAdapter(adapter);
特殊场景补充说明
如果两个布局中的ImageView控件ID不一致,可以再给构造函数新增一个ImageView ID的参数,传入后在ViewHolder的findViewById中使用该参数即可,适配性更强。
不推荐的原思路实现(仅做参考)
如果一定要在Adapter内部判断Activity类型,可以通过instanceof关键字判断Context类型实现,代码如下:
if (convertView == null) { inflater = LayoutInflater.from(context); if (context instanceof MainActivity) { convertView = inflater.inflate(R.layout.row_layout, parent, false); } else if (context instanceof MainActivity2) { convertView = inflater.inflate(R.layout.row_layout2, parent, false); } MyViewHolder myViewHolder = new MyViewHolder(convertView); convertView.setTag(myViewHolder); }
该方式会把Adapter和固定Activity绑定,后续新增使用场景必须修改Adapter内部代码,不建议使用。
内容的提问来源于stack exchange,提问作者Alif Meraz Hamid
相关产品推荐
相关产品推荐

