Demo展示app结构代码详解

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值