1.开发环境介绍
Android Studio 版本 3.6.2
Gradle 版本 3.6.1
API 30
minimum SDK :API 21 Android 5.0
2.ListView
- 组件效果如下图所示
- 首先建立一个基础工程,在 activity_main.xml 文件中编写以下代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>
- 效果如图
-
找到 MainActivity
// 首先声明控件 private ListView myListView; // 然后在onCreate方法中找到Listview myListView = findViewById(R.id.list_view);
-
给ListView的item添加数据,调用 setAdapter 方法。
3.Adapter介绍
-
Adapter 转接器
-
新建一个类,命名为 ListViewAdapter 并实现 BaseAdapter 接口
-
方法介绍
- getCount 获取item的数目返回给listView 即ListView中显示的item数量
- getItem 获取 item 每个item之间用 position 来区分
- getItemId 获取item的ID
- getView 获取item并赋值返回
-
为了组件缓存,提升复用率,可以创建一个静态内部类,来定义每个item中固有的组件
具体的编码如下
package com.example.listviewdemo;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
public class ListViewAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLyoutinflater;
public ListViewAdapter(Context mContext) {
this.mContext = mContext;
mLyoutinflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return 10; // 演示写死
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
static class ViewHolder{
// 缓存方便复用
public ImageView mimageView;
public TextView mTitle,mTime,mContent;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null){
convertView = mLyoutinflater.inflate(R.layout.list_item,null);
viewHolder = new ViewHolder();
// 获取每个item 的子组件
viewHolder.mimageView = convertView.findViewById(R.id.image);
viewHolder.mTitle = convertView.findViewById(R.id.title);
viewHolder.mTime = convertView.findViewById(R.id.time);
viewHolder.mContent = convertView.findViewById(R.id.content);
convertView.setTag(viewHolder); // 设置区分标志
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 赋值
viewHolder.mTitle.setText("这是标题");
viewHolder.mTime.setText("2020-12-02");
viewHolder.mContent.setText("这是内容栏");
// Glide是适用于Android的快速高效的开源媒体管理和图像加载框架,它将媒体解码,内存和磁盘缓存以及资源池包装到一个简单易用的界面中。
Glide.with(mContext)
.load("https://www.sise.com.cn/Uploads/2020-11-04/5fa226bc930d0.jpg")
.into(viewHolder.mimageView);
return convertView;
}
}
- 编写item的模型
新建一个layout,命名为 list_item,具体编码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="10dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
>
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#d5d5d5"
android:scaleType="centerCrop"
>
</ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginLeft="15dp"
>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="标题"
android:textColor="#000"
android:textSize="24sp"
>
</TextView>
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginBottom="10dp"
android:text="2020-12-2"
>
</TextView>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="内容"
>
</TextView>
</LinearLayout>
</LinearLayout>
- 效果图
4.Glide介绍及踩坑规避
- Glide是适用于Android的快速高效的开源媒体管理和图像加载框架,它将媒体解码,内存和磁盘缓存以及资源池包装到一个简单易用的界面中。
- 相关:https://github.com/bumptech/glide
安装
- 直接下载jar包然后放置于libs中
- 通过Gradle 或者 Maven 进行下载 【推荐使用】
repositories {
google()
jcenter()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
使用
- 详细使用参考官方文档
- 简单使用如下图所示
- 本次案例中使用
Glide.with(mContext)
.load("https://www.sise.com.cn/Uploads/2020-11-04/5fa226bc930d0.jpg")
.into(viewHolder.mimageView);
-
需要开启权限 INTERNET
找到 AndroidManifest.xml , 加入以下权限
<uses-permission android:name="android.permission.INTERNET" /> <!--网络访问权限-->
-
运行项目,如无法加载 【 雷区 】
- 如遇到如图中的错误,请卸载模拟器上的app重新编译下载即可
- 然后重新编译运行既可以正常加载程序