Demo展示App结构详解
架构思想:
把所有demo展示在一个页面中,点击一个demo会跳转到该demo自己的页面。
主页面结构
布局代码:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:layout_width="413dp"
android:layout_height="72dp"
tools:ignore="MissingConstraints">
<TextView
android:id="@+id/project_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="20dp"
android:layout_marginLeft="10dp" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private List<Enum> projectList = new ArrayList<>();
public enum projects{
AndroidThreadTest(R.string.changeText);
private int id;
projects(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initProjects();
RecyclerView recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
ProjectAdapter projectAdapter = new ProjectAdapter(projectList,this);
recyclerView.setAdapter(projectAdapter);
}
public void initProjects(){
projectList.add(projects.AndroidThreadTest);
}
}
首先把每一个demo变为枚举类中的一个实例。
这里把demo的中文名存入String.xml文件中,R.string.name
是一个整型数据,表示字符串在xml文件中的位置。
接下来就是加载组件和设置适配器,整体布局使用的是recyclerView,所以这里设置的适配不仅仅负责了把数据源(demo的中文名)传入布局中,还负责了recyclerView的点击事件。
initProjects()
负责把枚举类中的实例转换成数据源,也就是把他们加入到列表中。
适配器结构
public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> {
private int projectId;
private Context context;
private List<Enum> mProjectList;
public class ViewHolder extends RecyclerView.ViewHolder {
TextView projectNameTextView;
View projectView;
public ViewHolder(View view) {
super(view);
projectView = view;
projectNameTextView = view.findViewById(R.id.project_name);
}
}
public ProjectAdapter(List<Enum> ProjectList,Context context) {
mProjectList = ProjectList;
this.context =context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.project_item, parent, false);
ViewHolder holder = new ViewHolder(view);
holder.projectView.setOnClickListener(view1 -> {
int position = holder.getAdapterPosition();
MainActivity.projects project = (MainActivity.projects) mProjectList.get(position);
String classname = project.name();
// com.example.mynewapplication.
String all = "com.example.mynewapplication."+classname;
try {
Class<?> aClass = Class.forName(all);
Intent intent = new Intent(context,aClass);
context.startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
});
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
MainActivity.projects project = (MainActivity.projects) mProjectList.get(position);
projectId = project.getId();
holder.projectNameTextView.setText(context.getText(projectId));
}
@Override
public int getItemCount() {
return mProjectList.size();
}
}
适配器中通过上下文传入在MainActivity中设置好的数据源和得到需要在界面展示的demo的中文名。
写的时候遇到的难点
传入上下文
在一开始写的时候对Context的使用并不是很清楚,在适配器中需要在构造函数中设置Context参数,在MainActivity中设置适配器的时候需要把MainActivity作为上下文参数传入。
为什么要传入上下文呢?
1、数据源是设置在MainActivity中,如果在适配器中想要较好的对数据源中的属性进行操作(比如获取中文名),需要传入。
2、开启新的活动时需要传入一个上下文。
获得枚举实例所代表的类
写的时候在这里耽搁的比较久。
分别试了.class,getClass(),class.forName()
因为只能拿到枚举实例名字的字符串,所以.class没有用。
getClass()获取的不是所需要的东西。
class.forName()能完成目标,但是在这里有需要注意的点:
1、传入的类名必须带完整的包名。
2、启动活动的语句必须在try的作用域中。
RecyclerView的item布局问题
View view = LayoutInflater.from(context).inflate(R.layout.project_item, parent, false);
这句代码加载的是整个布局,其中的parent指定的item布局中最外层的高度,而不是文本或者其他控件的高度。
代码迭代情况
开始:
使用listview布局,通过HashMap,以demo为键,demo的中文名为值,采用列表下标的方式设置点击事件。优点:编写所用的知识点简单。缺点:代码逻辑复杂,且每次要新加demo的时候需要操作多步。
第二次:
依旧使用的是listview布局,但是这次把demo设置为枚举类中的实例,直接把实例作为点击事件的id,采用switch-case。优点:较开始所写的代码,可读性变高,代码逻辑变的简单,且新加demo的操作变少。缺点:虽然新加demo的操作变少,但是在点击事件中,代码重复性太高。
第三次:
使用recyclerView布局,依旧把demo设置为枚举类中的实例,但是因为采用的是recyclerView布局,点击事件发生改变。也就是本文中所展示的代码。优点:较前两次相比,整体代码变得简洁,新加demo操作降低,点击事件的代码复用性上升。
以上就是我写这个展示app的思想和遇到的问题。如果读者有更好的想法,请不吝指教。
源码下载地址:https://gitee.com/luozhaosong/study