You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:15:09