ListView学习
实现功能
- 以纵向列表的方式显示文本内容,实现纵向的滚动效果
- 可以对ListView的界面进行定制,包括点击效果和界面的跳转
基本组成部分
-
控件——桥梁——数据
-
ListView(列表)——Adapter(适配器)——Item(数据源)
- Adapter会从数据源中取出数据,等待显示
- 当需要显示数据的时候,ListView会从适配器(Adapter)中取出数据,然后来加载数据
- ListView负责以列表的形式向我们展示Adapter提供的内容
常用适配器分类
ArrayAdapter
特点
- 使用简单,用于将数组数据作为数据源绑定到列表项中,支持泛型操作
具体实现
- 添加ListView的xml布局文件(使用了ConstraintLayout约束布局):
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:orientation="vertical"
tools:context=".ArrayListActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
- 定义数据源:
private List<String> mStringList;
mStringList = new ArrayList<>();
//循环创建50个条目
for (int i = 0; i < 50; i++) {
mStringList.add("这是条目" + i);
}
- 创建ArrayAdapter适配器:
- ArrayAdapter构造方法:第一参数为Context,即上下文,指明了ArrayAdapter关联的View的运行环境,也就是我们当前的Activity;第二参数为要添加的item的布局id;第三参数为数据,可以用数组也可以用List
private ArrayAdapter<String> mArrayAdapter;
mArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,mStringList);
- 将ArrayAdapter适配器绑定到ListView上:
mListView.setAdapter(mArrayAdapter);
实现单击长按功能
-
有关活动的一些指令补充:
-
setContentView():将View加载到根view之上,当显示view时,先显示根view,再显示子view
-
setContentView必须要放在findViewById之前,因为view在加载之前是无法引用的
setContentView(R.layout.activity_array_list);
- findViewById(R.id.?):获取布局文件中的元素,返回一个view对象,使用时一般需要进行类型的强制转换
//列表的id设置的是lv
mListView = findViewById(R.id.lv);
单击指令
-
setOnItemClickListener():单击的方法,单击后会执行方法下的指令
-
onItemClick():
- parent参数:被点击的Adapter对象
- view参数:被点击的Item(可用于获取该item内的组件)
- position参数:被点击的是第几个item
- id参数:当前点击的item在listview里的第几行位置(通常与position的值相同)
-
Toast用法:
- 使用makeText()创建一个Toast对象,然后调用show()函数进行显示
- makeText()第一参数为Context(上下文),第二参数为Toast显示的文本内容,第三参数是Toast显示的时长,内置两个类型Toast.LENTH_SHORT(显示时间短)和Toast.LENTH_LONG(显示时间长)
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(ArrayListActivity.this,"你单击了"+ position, Toast.LENGTH_SHORT).show();
}
});
- 解决多次点击连续触发Toast显示的问题:
- 将Toast的调用封装成一个接口,写在一个公共的类中
- 当mToast不为空时,将原mToast强制中断再传入新的mToast,防止多次点击使Toast不能及时显示新的提示
public class ToastUtil {
public static Toast mToast;
public static void ShowMsg (Context context, String string) {
if (mToast != null) {
mToast.cancel();
}
mToast = Toast.makeText(context, string, Toast.LENGTH_SHORT);
mToast.show();
}
}
- 修改后的单击Toast代码:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
toastutil = new ToastUtil();
toastutil.ShowMsg(getApplicationContext(),"你单击了"+position);
}
});
长按指令
-
类似的,长按的代码如下:
-
onItemLongClick()的返回值为:
- true,表示本方法处理了长按事件,该事件不会分发给其他控件处理
- false,表示本次长按事件还会分发给其他控件处理
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
toastutil = new ToastUtil();
toastutil.ShowMsg(getApplicationContext(),"你长按了"+position);
return true;
}
});
ArrayAdapter的完整代码
package com.example.listview;
import androidx.appcompat.app.AppCompatActivity;
import android.icu.text.Transliterator;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import com.example.listview.ToastUtil;
public class ArrayListActivity extends AppCompatActivity {
private ListView mListView;
private List<String> mStringList;
private ArrayAdapter<String> mArrayAdapter;
private ToastUtil toastutil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_array_list);
mListView = findViewById(R.id.lv);
mStringList = new ArrayList<>();
//定义数据源
for (int i = 0; i < 50; i++) {
mStringList.add("这是条目" + i);
}
//创建ArrayAdapter适配器
mArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,mStringList);
//绑定适配器到ListView上
mListView.setAdapter(mArrayAdapter);
//单击方法的实现
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
toastutil = new ToastUtil();
toastutil.ShowMsg(getApplicationContext(),"你单击了"+position);
}
});
//长按方法的实现
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
toastutil = new ToastUtil();
toastutil.ShowMsg(getApplicationContext(),"你长按了"+position);
return true;
}
});
}
}
SimpleAdapter
特点
相比ArrayAdapter来说,功能比较强大,可以将数据源的数据一一绑定到item中的view里
具体实现
- 添加ListView的xml布局文件:
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:orientation="vertical"
tools:context=".SimpleListActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
- 实现item布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingTop="5dp"
android:paddingRight="10dp"
android:paddingBottom="5dp">
<ImageView
android:id="@+id/iv_img"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv_img"
android:ellipsize="end"
android:maxLines="1"
android:text=""
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv_img"
android:ellipsize="end"
android:maxLines="3"
android:text=""
android:textSize="16sp"
android:textStyle="italic" />
</RelativeLayout>
-
创建数据源:
- 数据源的固定格式为List<Map<String,Object>>,List里面存放的一条条数据就是对应item中的数据
- item布局的每个控件都需要设置,如果布局较复杂,则需要每个控件单独编写
- R.drawable是一种特殊的int类型,被R文件映射的的都是int类型,它可以被视作一种地址索引
private List<Map<String,Object>> mList;
//将drawable中的六个图片打包成一个数组
private int[] imgs = {
R.drawable.test1,
R.drawable.test2,
R.drawable.test3,
R.drawable.test4,
R.drawable.test5,
R.drawable.test6
};
private String[] title = new String[]{"雪山","乡村","湖边","日落","海边","西湖"};
mList = new ArrayList<>();
for (int i = 0; i <= 50; i++) {
Map<String,Object> map = new HashMap();
//循环进行创建
map.put("img",imgs[i%imgs.length]);
map.put("title",title[i%title.length]);
map.put("content", "这是内容"+i);
mList.add(map);
}
-
创建SimpleAdapter
-
SimpleAdapter的构造方法和ArrayAdapter很类似,但也有不同的地方。
-
SimpleAdapter(Context context, List<Map<String,Object>> data, int resource, String[] from, int[] to)
- 第一参数为context,即上下文,指明了SimpleAdapter关联的View的运行环境,也就是我们当前的Activity
- 第二参数为List<Map<String,Object>>类型的data,在该List中的每个条目对应ListView的一行,每一个Map中包含的就是所有在from参数中指定的key
- 第三参数为resource,定义列表项的布局文件id,该资源文件至少应该包含在to参数中定义的id
- 第四参数是from,是将被添加到Map映射上的key
- 第五参数是to,将绑定数据的视图id跟from参数对应
private SimpleAdapter mSimpleAdapter;
mSimpleAdapter = new SimpleAdapter(this,
mList,
R.layout.base_list,
new String[]{"img", "title", "content"},
new int[]{R.id.iv_img,R.id.tv_title,R.id.tv_content}
);
- 将SimpleAdapter绑定到ListView中
mListview.setAdapter(mSimpleAdapter);
SimpleAdapter的完整代码
package com.example.listview;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SimpleListActivity extends AppCompatActivity {
private ListView mListview;
private SimpleAdapter mSimpleAdapter;
private List<Map<String,Object>> mList;
//将drawable中的六个图片打包成一个数组
private int[] imgs = {
R.drawable.test1,
R.drawable.test2,
R.drawable.test3,
R.drawable.test4,
R.drawable.test5,
R.drawable.test6
};
private String[] title = new String[]{"雪山","乡村","湖边","日落","海边","西湖"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_list);
mListview = findViewById(R.id.lv);
//将mList实例化为一个动态数组
//mList中的每个元素就是每个item的布局
mList = new ArrayList<>();
for (int i = 0; i <= 50; i++) {
Map<String,Object> map = new HashMap();
map.put("img",imgs[i%imgs.length]);
map.put("title",title[i%title.length]);
map.put("content", "这是内容"+i);
//将所有map添加到mList中,把所有item的布局封装在一个数组里
mList.add(map);
}
//创建SimpleAdapter
mSimpleAdapter = new SimpleAdapter(this,
mList,
R.layout.base_list,
new String[]{"img", "title", "content"},
new int[]{R.id.iv_img,R.id.tv_title,R.id.tv_content}
);
mListview.setAdapter(mSimpleAdapter);
}
}
BaseAdapter
特点
可以最大程度的定制我们自己的item
具体实现
- 布局中添加ListView
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:orientation="vertical"
tools:context=".BaseAdapterActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
- 实现item布局
- 可以直接使用SimpleAdapter中的item布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingTop="5dp"
android:paddingRight="10dp"
android:paddingBottom="5dp">
<ImageView
android:id="@+id/iv_img"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv_img"
android:ellipsize="end"
android:maxLines="1"
android:text=""
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv_img"
android:ellipsize="end"
android:maxLines="3"
android:text=""
android:textSize="16sp"
android:textStyle="italic" />
</RelativeLayout>
-
创建数据源
-
新建一个ItemBean类,将所有数据的属性和方法封装在一起
package com.example.listview.bean;
import java.io.Serializable;
//implements Serializable是让ItemBean实现Serializable接口,以便类的对象可以被序列化
public class ItemBean implements Serializable {
//item的标题
private String title;
//item的内容
private String content;
//item的图片索引id
private int imgResId;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getImgResId() {
return imgResId;
}
public void setImgResId(int imgResId) {
this.imgResId = imgResId;
}
@Override
public String toString() {
return "ItemBean{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
", imgResId=" + imgResId +
'}';
}
}
- 将所有item的布局数据储存在数组中
private List<ItemBean> mBeanList;
private void initData() {
mBeanList = new ArrayList<>();
ItemBean itemBean1 = new ItemBean();
itemBean1.setTitle("雪山");
itemBean1.setContent("雪山总是那么让人向往,它高耸而冷漠,它洁白而危险,它是无数爬山爱好者梦寐以求的天堂,它是百万摄影师极力拉拢的模特。");
itemBean1.setImgResId(R.drawable.test1);
ItemBean itemBean2 = new ItemBean();
itemBean2.setTitle("乡村");
itemBean2.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean2.setImgResId(R.drawable.test2);
ItemBean itemBean3 = new ItemBean();
itemBean3.setTitle("湖边");
itemBean3.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean3.setImgResId(R.drawable.test3);
ItemBean itemBean4 = new ItemBean();
itemBean4.setTitle("日落");
itemBean4.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean4.setImgResId(R.drawable.test4);
ItemBean itemBean5 = new ItemBean();
itemBean5.setTitle("海边");
itemBean5.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean5.setImgResId(R.drawable.test5);
ItemBean itemBean6 = new ItemBean();
itemBean6.setTitle("西湖");
itemBean6.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean6.setImgResId(R.drawable.test6);
mBeanList.add(itemBean1);
mBeanList.add(itemBean2);
mBeanList.add(itemBean3);
mBeanList.add(itemBean4);
mBeanList.add(itemBean5);
mBeanList.add(itemBean6);
}
-
创建自己的Adapter
-
新建一个MyAdapter类继承自BaseAdapter,需要实现它的四个方法
-
LayoutInflater用法:
-
先获取实例,有两种方法:
LayoutInflater inflater = LayoutInflater.from(this);
LayoutInflater inflater1= (LayoutInflater) this.getSystemService(this.LAYOUT_INFLATER_SERVICE);
- 得到了LayoutInflater的实例之后就可以调用它的inflate()方法来加载布局了
- inflater.inflate(int resource, ViewGroup root, boolean attachToRoot)
- 第一个参数resource,是需要加载的布局文件的id,要将这个布局文件加载到Activity中来操作
- 第二个参数root,是需要附加到resource()资源文件的根控件
- 第三个参数attachToRoot,代表是否将root附加到布局文件的根视图上
package com.example.listview.adapter;
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.example.listview.R;
import com.example.listview.bean.ItemBean;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private List<ItemBean> mBeanList;
private LayoutInflater mLayoutInflater;
private Context mContext;
public MyAdapter(Context context, List<ItemBean> beanList){
this.mContext = context;
this.mBeanList = beanList;
mLayoutInflater = LayoutInflater.from(mContext);
}
//返回适配器中所代表的数据集合的条数
//会首先执行这个方法(连续执行好几次),如果是0则后面的方法就不会执行了
@Override
public int getCount() {
return mBeanList.size();
}
//返回数据集合中指定索引position对应的数据项
//手动调用才会执行
@Override
public Object getItem(int position) {
return mBeanList.get(position);
}
//返回列表中与指定索引对应的行id
//手动调用才会执行
@Override
public long getItemId(int position) {
return position;
}
//返回指定索引对应的数据的视图
//会多次调用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//使用convertView作为View缓存,将convertView作为getView的输入参数、返回参数
//借助ListView的缓存机制,实现view的复用
convertView = mLayoutInflater.inflate(R.layout.base_list,parent,false);
ImageView imageView = convertView.findViewById(R.id.iv_img);
TextView tvTitle = convertView.findViewById(R.id.tv_title);
TextView tvContent = convertView.findViewById(R.id.tv_content);
ItemBean itemBean = mBeanList.get(position);
imageView.setImageResource(itemBean.getImgResId());
tvTitle.setText(itemBean.getTitle());
tvContent.setText(itemBean.getContent());
return convertView;
}
}
-
Adapter的优化
-
getView调用很频繁,因此内部需要做尽可能少的业务逻辑处理
-
getView中不要出现大量的对象,最好把创建对象放到ViewHolder中
-
-
优化后的代码
package com.example.listview.adapter;
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.example.listview.R;
import com.example.listview.bean.ItemBean;
import java.util.List;
public class MyAdapter3 extends BaseAdapter {
private List<ItemBean> mBeanList;
private LayoutInflater mLayoutInflater;
private Context mContext;
public MyAdapter3(Context context, List<ItemBean> beanList){
this.mContext = context;
this.mBeanList = beanList;
mLayoutInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return mBeanList.size();
}
@Override
public Object getItem(int position) {
return mBeanList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
//判断当convertView为空时,向viewHolder中传入数据
//重用View的时候不用再次重复使用findViewById了
if (convertView == null){
convertView = mLayoutInflater.inflate(R.layout.base_list,parent,false);
ImageView imageView = convertView.findViewById(R.id.iv_img);
TextView tvTitle = convertView.findViewById(R.id.tv_title);
TextView tvContent = convertView.findViewById(R.id.tv_content);
viewHolder.imageView = imageView;
viewHolder.tvTitle = tvTitle;
viewHolder.tvContent = tvContent;
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
ItemBean itemBean = mBeanList.get(position);
//使用viewHolder来操作,减少findViewById方法的使用
viewHolder.imageView.setImageResource(itemBean.getImgResId());
viewHolder.tvTitle.setText(itemBean.getTitle());
viewHolder.tvContent.setText(itemBean.getContent());
return convertView;
}
//ViewHolder是一个临时的数据存储器
class ViewHolder {
ImageView imageView;
TextView tvTitle;
TextView tvContent;
}
}
BaseAdapter的完整代码
package com.example.listview;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.example.listview.adapter.MyAdapter;
import com.example.listview.bean.ItemBean;
import java.util.ArrayList;
import java.util.List;
public class BaseAdapterActivity extends AppCompatActivity {
private ListView mListView;
private List<ItemBean> mBeanList;
private MyAdapter mMyAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_adapter);
initView();
initData();
initEvent();
}
private void initEvent() {
mMyAdapter = new MyAdapter(this, mBeanList);
mListView.setAdapter(mMyAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ItemBean itemBean = mBeanList.get(position);
String title = itemBean.getTitle();
//NewsDetailActivity是点击列表项弹出的界面,用intent将其绑定到BaseAdapter界面
Intent intent = new Intent(BaseAdapterActivity.this,NewsDetailActivity.class);
//利用putExtra进行数据的提交,方便弹出界面进行调用(只有序列化的数据才能传输)
intent.putExtra("item",itemBean);
startActivity(intent);
ToastUtil.ShowMsg(BaseAdapterActivity.this,"你单击了"+position+title);
}
});
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ItemBean itemBean = mBeanList.get(position);
String title = itemBean.getTitle();
ToastUtil.ShowMsg(BaseAdapterActivity.this,"你长按了"+position+title);
return true;
}
});
}
private void initData() {
mBeanList = new ArrayList<>();
ItemBean itemBean1 = new ItemBean();
itemBean1.setTitle("雪山");
itemBean1.setContent("雪山总是那么让人向往,它高耸而冷漠,它洁白而危险,它是无数爬山爱好者梦寐以求的天堂,它是百万摄影师极力拉拢的模特。");
itemBean1.setImgResId(R.drawable.test1);
ItemBean itemBean2 = new ItemBean();
itemBean2.setTitle("乡村");
itemBean2.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean2.setImgResId(R.drawable.test2);
ItemBean itemBean3 = new ItemBean();
itemBean3.setTitle("湖边");
itemBean3.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean3.setImgResId(R.drawable.test3);
ItemBean itemBean4 = new ItemBean();
itemBean4.setTitle("日落");
itemBean4.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean4.setImgResId(R.drawable.test4);
ItemBean itemBean5 = new ItemBean();
itemBean5.setTitle("海边");
itemBean5.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean5.setImgResId(R.drawable.test5);
ItemBean itemBean6 = new ItemBean();
itemBean6.setTitle("西湖");
itemBean6.setContent("这是一段内容,它是内容但是却没有内容,如果你想要写下自己的东西,请将这段话删除之后再填入。如果不想填入内容,请将内容保留。");
itemBean6.setImgResId(R.drawable.test6);
mBeanList.add(itemBean1);
mBeanList.add(itemBean2);
mBeanList.add(itemBean3);
mBeanList.add(itemBean4);
mBeanList.add(itemBean5);
mBeanList.add(itemBean6);
}
private void initView() {
mListView = findViewById(R.id.lv);
}
}
弹出界面的制作
弹出界面的布局
//ScrollView是一种可滚动的布局容器
//当ScrollView的内容大于他本身的size的时候,ScrollView会自动添加滚动条,并可以竖直滑动
<ScrollView 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"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
tools:context=".NewsDetailActivity">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="雪山"
android:textSize="25sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv_img"
android:layout_width="400dp"
android:layout_height="300dp"
android:layout_marginTop="10dp"
android:scaleType="centerCrop"
android:src="@color/design_default_color_primary_dark"/>
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="40dp"
android:gravity="start|left"
android:text="雪山总是那么让人向往,它高耸而冷漠,它洁白而危险,它是无数爬山爱好者梦寐以求的天堂,它是百万摄影师极力拉拢的模特。"
android:textSize="16sp"
/>
</LinearLayout>
</ScrollView>
弹出界面的完整代码
- 在BaseAdapter代码中已经用intent将弹出界面与列表界面打通
- 剩下的只需要获取列表的数据并显示出来就可以了
package com.example.listview;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.listview.bean.ItemBean;
public class NewsDetailActivity extends AppCompatActivity {
private TextView mTvTitle;
private TextView mTvContent;
private ImageView mIvImage;
private ItemBean mItemBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_detail);
initView();
initData();
initEvent();
}
private void initView() {
mIvImage = findViewById(R.id.iv_img);
mTvTitle = findViewById(R.id.tv_title);
mTvContent = findViewById(R.id.tv_content);
}
private void initData() {
Intent intent = getIntent();
//将BaseAdapter界面的数据接收过来
mItemBean = (ItemBean) intent.getSerializableExtra("item");
}
private void initEvent() {
if (mItemBean != null) {
mIvImage.setImageResource(mItemBean.getImgResId());
mTvTitle.setText(mItemBean.getTitle());
mTvContent.setText(mItemBean.getContent());
}
}
}