大项目模块一 | 青训营笔记

113 阅读3分钟

项目实践一 | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的的第11天;

用于记录开发过程中学习到的知识点。

RecyclerView的基础使用

RecyclerView:这是一个和listView有些相似的列表结构控件,可以实现一些复杂的列表的显示及事件内容。

基本使用方法:
  1. 设置一个基础的布局文件作为基础,在其镶嵌RecyclerView模块。
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <TextView
            android:id="@+id/telList"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:gravity="center"
            android:text="@string/telList"
            tools:ignore="MissingConstraints"
            tools:layout_editor_absoluteX="71dp"
            tools:layout_editor_absoluteY="27dp" />
    
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/List"
        class="androidx.appcompat.app.AlertController$RecycleListView"
        android:layout_width="match_parent"
        android:layout_height="769dp"
        android:layout_marginTop="130dp"
        tools:ignore="InvalidId,MissingConstraints"
        tools:layout_editor_absoluteX="3dp"
        tools:layout_editor_absoluteY="112dp">
    
    </androidx.recyclerview.widget.RecyclerView>
    </RelativeLayout>
    

  1. 在重新创建一个xml文件,用于设置RecyclerView中每行的样式。
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        >
    
        <ImageView
            android:id="@+id/poster"
            android:layout_width="113dp"
            android:layout_height="160dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="20dp"
            tools:ignore="ContentDescription"
            android:src="@drawable/ic_pic"
            />
    
        <TextView
            android:id="@+id/telRank"
            android:layout_width="45dp"
            android:layout_height="20dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="20dp"
            android:background="@android:color/holo_orange_light"
            android:gravity="center"
            android:text="@string/telRank"
            android:textColor="#E41515" />
    
                        .........
    
        <LinearLayout
            android:layout_width="150dp"
            android:layout_height="50dp"
            android:layout_marginStart="300dp"
            android:layout_marginTop="135dp"
            android:orientation="horizontal"
            tools:ignore="UseCompoundDrawables">
    
            <ImageView
                android:id="@+id/hotImg"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginStart="10dp"
                android:layout_marginTop="10dp"
                android:contentDescription="@string/todo"
                android:src="@drawable/hot" />
    
            <TextView
                android:id="@+id/hot"
                android:layout_width="60dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="13dp"
                android:gravity="center" />
        </LinearLayout>
    
    </RelativeLayout>
    
    图示:

3.在代码中为其设置适配器 Adapter,此类需要包含有一个承载列表item布局的viewholde,此viewholder类的作用就是承载item布局文件中的控件获取。

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new TelHolder(layoutInflater.inflate(R.layout.activity_model_tel,parent,false));
}

@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    telRank=holder.itemView.findViewById(R.id.telRank);
    int rank=position+1;
    telRank.setText("TOP"+rank);
     ((TelHolder)(holder)).bindHolder(mylist.get(position));
}

@Override
public int getItemViewType(int position) {
    return mylist.get(position).type;
}

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

  1. 由于数据是从openApi获取的,所以需要单独设计一个数据类进行读取。
    public class TelBean {
        public String active_time;
        public List<S> list;
        public String error_code;
    
        public static class S{
            public  final int type=1;
            public List<String> actors;
            public List<String> directors;
            public String hot;
            public String name;
            public String poster;
            public String release_date;
            public String name_en;
        }
    }
    

Gson库的使用

Gson是一个Java类库,用于将Java对象转换为它们所代表的JSON数据,也可以用于将一个JSON字符串转换为对应的Java对象

导入Gson库: implementation 'com.google.code.gson:gson:2.8.2'

  1. 将JavaBean转换为json,或将json字符串转换为JavaBean。
    Gson gson=new Gson();
    Type type=new TypeToken<TelBean>(){}.getType();
    TelBean telBean =gson.fromJson(String.valueOf(object1),type);
    
  2. 将List集合转换为json,或将json转换为List集合。
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("李华", 16, false, Arrays.asList("写信", "宣传")));
        list.add(new Person("王五", 16, true, Arrays.asList("看书", "玩游戏")));
        System.out.println(list);
        // 创建Gson实例
        Gson gson = new Gson();
        // 调用Gson的toJson方法
        String listJson = gson.toJson(list);
        System.out.println(listJson);
    
  3. 将Map集合转换为json,或将json转换为Map集合。
        Map<String, Person> map = new HashMap<>();
        map.put("p1", new Person("李华", 35, true, Arrays.asList("写信", "宣传")));
        map.put("p2", new Person("王五", 33, false, Arrays.asList("看书", "玩游戏")));
    
        Gson gson = new Gson();
        String mapJson = gson.toJson(map);
    
        System.out.println(mapJson);
    
        Map<String, Person> jsonMap = gson.fromJson(mapJson, new TypeToken<Map<String, Person>>() { }.getType());
        System.out.println(jsonMap);
    

Glide库的使用

由于Android中原生imageView组件无法展示网络图片,所以采用Glide进行转化。

Glide是一个快速高效的Android图片加载库,注重于平滑的滑动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术

导入Glide库:

implementation 'com.github.bumptech.glide:glide:4.13.2' 
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2'

使用:

Glide.with(poster).load(list.poster).fitCenter().into(poster);
  • 首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收ContextActivity或者Fragment类型的参数。

  • 其次,load()方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。

  • 最后,into() 方法,我们希望让图片显示在哪个ImageView上,把这个 ImageView 的实例传进去就可以了。


注意:由于从Android9开始,默认禁止明文传输;  所以需要在Manifest中配置上允许明文传输。

<uses-permission android:name="android.permission.INTERNET" />