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
相关产品推荐
相关产品推荐

