项目实践一 | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第11天;
用于记录开发过程中学习到的知识点。
RecyclerView的基础使用
RecyclerView:这是一个和listView有些相似的列表结构控件,可以实现一些复杂的列表的显示及事件内容。
基本使用方法:
- 设置一个基础的布局文件作为基础,在其镶嵌
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>
- 在重新创建一个
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();
}
- 由于数据是从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'
- 将JavaBean转换为json,或将json字符串转换为JavaBean。
Gson gson=new Gson(); Type type=new TypeToken<TelBean>(){}.getType(); TelBean telBean =gson.fromJson(String.valueOf(object1),type); - 将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); - 将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()方法可以接收Context、Activity或者Fragment类型的参数。 -
其次,
load()方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。 -
最后,
into()方法,我们希望让图片显示在哪个ImageView上,把这个ImageView的实例传进去就可以了。
注意:由于从Android9开始,默认禁止明文传输; 所以需要在Manifest中配置上允许明文传输。
<uses-permission android:name="android.permission.INTERNET" />