ListView:垂直列表显示内容
- ListView的作用
ListView只有一项工作,那就是展示数据。它并不关系数据从哪而来,数据到底是什么类型等等,它只负责展示数据。但是,它要是没数据的话也谈不上展示了。所以它有一个好基友,那就是Adapter。ListView需要访问什么数据,都是吩咐Adapter帮忙去访问数据的。两朋友形成了一种良好的工作模式,Adapter只负责提供数据,ListView只负责展示数据。所以要了解ListView那颗浪荡不羁的心,我们也需要了解Adapter,这样才能更好地把控ListView的洪荒之力。 - Adapter的作用
Adapter做的工作,就是帮ListView去适配数据源的,这样ListView就不用烦恼数据的问题了,它就可以专心做好展示的工作。Adapter本身是一个接口,所以它能实现各种各样的子类,子类就通过自己特定的逻辑去完成特定的功能,去适配特定的数据。例如,ArrayAdapter可以用于数组和List类型的数据源适配等等。
同时,我们继承Adapter的时候,有一个灰常重要的方法需要我们重写,那就是public View getView()方法。 - 使用
1.创建ListView:.xml .代码
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
2.初始化数据
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.lv);
//初始化数据
initDate();
//设置行与行之间的间距
listView.setDividerHeight(20);
}
//准备数据源
public void initDate(){
friendModels=new ArrayList<>();
//创建一个好友
FriendModel model=new FriendModel(R.drawable.ic_launcher_foreground,"jack");
//添加到数组
friendModels.add(model);
}
}
/**
* ImageView:用于显示图片的额控件
* Bitmap:具体的某一张图片数据
* R.drawable.bg:只是图片对应的id
*/
public class FriendModel {
public int icon;
public String name;
public FriendModel(int icon, String name) {
this.icon = icon;
this.name = name;
}
}
3.配置数据:创建一个类继承BaseAdapter
//定义数据适配器
public class MyAdapter extends BaseAdapter{
//配置ListView有多少行
@Override
public int getCount() {
return friendModels.size();
}
//获取数据源(数组:所有的数据,如所有的好友的信息)里面position行对应的数据
@Override
public Object getItem(int position) {
return null;
}
//获取position位置对应的id
//id就是这一行对应的索引值
@Override
public long getItemId(int position) {
return position;
}
//配置每行显示什么内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
//创建文本视图
TextView textView=new TextView(getApplicationContext());
textView.setText("row"+position);
textView.layout(0,0,300,100);
*/
//将一个layout.xml文件转化为对应的视图
View view=View.inflate(getApplicationContext(),R.layout.layout_qq,null);
return view;
}
}
4.设置ListView的适配器(数据)
//设置适配器
listView.setAdapter(new MyAdapter());
5.创建layout布局每一行放入具体样式
使用View.Inflate 解析layout布局文件->View
<View
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorPrimaryDark"
android:tag="vTag"
/>
6.响应用户的点击事件setOnItemClickListener - onItemClick
//设置监听器监听用户的行为
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//先将Item对应的视图转化为ViewGroup
ViewGroup viewGroup=(ViewGroup)view;
//查找容器里的子视图
View v=viewGroup.findViewWithTag("vTag");
//操作这个视图
v.setBackgroundColor(Color.BLACK);
//切换到下一个界面
//调用系统的或者某个应用的方式:隐式意图
//Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//显示意图:直接指明跳转到那个界面
Intent intent=new Intent(getApplicationContext(),SencondActivity.class);
//开始切换
startActivity(intent);
//新建跳转的界面
public class SencondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sencond);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();//关闭当前的界面
return true;
}
}
<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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".SencondActivity"
tools:showIn="@layout/activity_sencond">
</androidx.constraintlayout.widget.ConstraintLayout>
注意:每行显示的内容通常是用layout.xml配置文件
-
效果展示
首界面
点击后跳转界面
再次点击返回,背景颜色变黑