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

Android Studio中高校题库APP大量Activity的优化方案咨询

解决方案:复用通用页面+参数传递,彻底告别上千个Activity

嘿,这个问题我太有共鸣了——当年我做校园分类导航类APP时,差点也犯了创建几百个页面的傻!完全没必要搞1120个Activity,核心思路就是复用同一个列表页面,通过Intent传递层级参数来加载对应数据,完美解决你的嵌套选择需求。

核心逻辑

把「院系→学期→科目」这三层选择,全部交给一个通用的列表Activity(比如叫CategoryListActivity)处理。每次跳转时,通过Intent告诉这个页面:

  • 当前要展示的层级类型(院系/学期/科目)
  • 父级数据的ID(比如选了某个院系后,传递该院系的ID来加载对应的学期)

这样不管多少个院系、学期、科目,只需要1个列表Activity + 1个通用适配器就够了。

具体实现步骤

1. 设计关联的数据模型

先把院系、学期、科目做成关联的数据结构,方便根据父级ID查询子级数据。可以用Room数据库存储,或者直接打包成本地JSON文件:

// 院系模型
public class Department {
    public int id;
    public String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

// 学期模型,关联院系ID
public class Semester {
    public int id;
    public int departmentId;
    public String name;

    public Semester(int id, int departmentId, String name) {
        this.id = id;
        this.departmentId = departmentId;
        this.name = name;
    }
}

// 科目模型,关联学期ID
public class Subject {
    public int id;
    public int semesterId;
    public String name;
    public String downloadUrl; // 真题文件的下载地址

    public Subject(int id, int semesterId, String name, String downloadUrl) {
        this.id = id;
        this.semesterId = semesterId;
        this.name = name;
        this.downloadUrl = downloadUrl;
    }
}

2. 编写通用列表Activity

这个Activity负责根据传递的参数,加载对应层级的数据并展示:

public class CategoryListActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private CategoryAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_category_list);

        // 获取Intent传递的参数
        String currentLevel = getIntent().getStringExtra("LEVEL");
        int parentId = getIntent().getIntExtra("PARENT_ID", -1);

        // 初始化RecyclerView
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 根据层级加载对应数据
        List<Object> dataList = loadDataByLevel(currentLevel, parentId);
        // 设置页面标题
        setPageTitle(currentLevel);

        // 初始化通用适配器
        adapter = new CategoryAdapter(dataList, currentLevel, this);
        recyclerView.setAdapter(adapter);
    }

    // 根据层级和父ID加载数据
    private List<Object> loadDataByLevel(String level, int parentId) {
        List<Object> dataList = new ArrayList<>();
        switch (level) {
            case "DEPARTMENT":
                // 加载所有院系数据,这里可以从数据库/JSON读取
                dataList.add(new Department(1, "计算机学院"));
                dataList.add(new Department(2, "文学院"));
                // ... 剩下12个院系
                break;
            case "SEMESTER":
                // 根据院系ID加载对应学期
                dataList.add(new Semester(1, parentId, "第1学期"));
                dataList.add(new Semester(2, parentId, "第2学期"));
                // ... 剩下6个学期
                break;
            case "SUBJECT":
                // 根据学期ID加载对应科目
                dataList.add(new Subject(1, parentId, "高等数学", "https://example.com/math.pdf"));
                dataList.add(new Subject(2, parentId, "大学英语", "https://example.com/english.pdf"));
                // ... 剩下8个科目
                break;
        }
        return dataList;
    }

    // 设置页面标题
    private void setPageTitle(String level) {
        switch (level) {
            case "DEPARTMENT":
                setTitle("选择院系");
                break;
            case "SEMESTER":
                setTitle("选择学期");
                break;
            case "SUBJECT":
                setTitle("选择科目");
                break;
        }
    }
}

3. 编写通用RecyclerView适配器

适配器负责渲染不同层级的列表项,并处理点击跳转逻辑:

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {
    private List<Object> dataList;
    private String currentLevel;
    private Context context;

    public CategoryAdapter(List<Object> dataList, String currentLevel, Context context) {
        this.dataList = dataList;
        this.currentLevel = currentLevel;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_category, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Object item = dataList.get(position);
        String itemName = "";
        int itemId = -1;

        // 根据层级解析数据
        switch (currentLevel) {
            case "DEPARTMENT":
                Department dept = (Department) item;
                itemName = dept.name;
                itemId = dept.id;
                break;
            case "SEMESTER":
                Semester semester = (Semester) item;
                itemName = semester.name;
                itemId = semester.id;
                break;
            case "SUBJECT":
                Subject subject = (Subject) item;
                itemName = subject.name;
                itemId = subject.id;
                break;
        }

        holder.itemName.setText(itemName);

        // 处理点击事件,跳转到下一层级或触发下载
        holder.itemView.setOnClickListener(v -> {
            Intent intent;
            switch (currentLevel) {
                case "DEPARTMENT":
                    // 跳转到学期选择页
                    intent = new Intent(context, CategoryListActivity.class);
                    intent.putExtra("LEVEL", "SEMESTER");
                    intent.putExtra("PARENT_ID", itemId);
                    context.startActivity(intent);
                    break;
                case "SEMESTER":
                    // 跳转到科目选择页
                    intent = new Intent(context, CategoryListActivity.class);
                    intent.putExtra("LEVEL", "SUBJECT");
                    intent.putExtra("PARENT_ID", itemId);
                    context.startActivity(intent);
                    break;
                case "SUBJECT":
                    // 点击科目,触发真题下载
                    Subject subject = (Subject) item;
                    startDownload(subject.downloadUrl);
                    break;
            }
        });
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView itemName;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            itemName = itemView.findViewById(R.id.tv_item_name);
        }
    }

    // 实现下载逻辑,这里可以用Android系统的DownloadManager
    private void startDownload(String url) {
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setTitle("真题下载");
        request.setDescription("正在下载真题文件");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "真题.pdf");

        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        if (manager != null) {
            manager.enqueue(request);
        }
    }
}

4. 初始启动

在你的启动页(比如MainActivity)里,直接跳转到院系选择页:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 直接跳转到院系选择页
        Intent intent = new Intent(this, CategoryListActivity.class);
        intent.putExtra("LEVEL", "DEPARTMENT");
        startActivity(intent);
        finish(); // 关闭启动页
    }
}

额外优化建议

  • 用Fragment代替Activity:如果想采用单Activity架构,可以把通用列表做成Fragment,用Navigation组件管理跳转,更灵活;
  • 数据持久化:把所有院系、学期、科目数据提前存入Room数据库或者assets目录下的JSON文件,避免硬编码;
  • ViewModel管理数据:用ViewModel保存加载的数据,避免屏幕旋转等配置变化时重新加载;
  • 添加加载状态:给列表添加加载中、空数据的状态,提升用户体验。

内容的提问来源于stack exchange,提问作者gokulnath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:09:02