简介
ListView
ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。
Adapter适配器
adapter是数据与ui之间的桥梁,它把后台数据与前端ui连接到一起,是一个展示数据的载体。
代码实操
-
主要步骤
-
创建ListView的子项
-
创建一个Adapter(适配器)对象
-
创建ListView对象,并且把Adapter装进去
-
创建ListView的子项
- 我们可以发现他的可变的几个变量就是商品名称,商品价格以及图片,所以我们可以创建一个类来存储数据
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">
<TextView
android:id="@+id/good"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="65dp"
android:layout_marginTop="65dp"
android:text="商品名称:" />
<TextView
android:id="@+id/goodname"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="129dp"
android:layout_marginTop="65dp"
android:text="默认" />
<TextView
android:id="@+id/price"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="65dp"
android:layout_marginEnd="154dp"
android:text="价格:" />
<TextView
android:id="@+id/pricenum"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="65dp"
android:layout_marginEnd="90dp"
android:text="0.0" />
<Button
android:id="@+id/buy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="45dp"
android:text="购买" />
<ImageView
android:id="@+id/img"
android:layout_width="59dp"
android:layout_height="45dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="-1dp"
android:layout_marginTop="45dp"
tools:srcCompat="@tools:sample/avatars" />
</RelativeLayout>
效果图
自定义Production类
public class Production {
private String title;
private Double price;
private Integer imgId;
public Production(String title, Double price, Integer imgId) {
this.title = title;
this.price = price;
this.imgId = imgId;
}
public void set(String title, Double price, Integer imgId) {
this.title = title;
this.price = price;
this.imgId = imgId;
}
public Production() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Integer getIngId() {
return imgId;
}
public void setIngId(Integer imgId) {
this.imgId = imgId;
}
}
自定义适配器对象
- 为什么是有参构造?因为在ListviewActivity中可以直接将数据和context传给适配器
getCount
方法是返回总行数的,也就是数据的条数getItem
返回当前的行的信息getItemId
返回当前的位置,即当前在第几行getView
在这里面进行数据的拼装
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.androidtest.R;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private List<Production> productions = null;
private Context context = null;
public MyAdapter(List<Production> productions, Context context) {
super();
this.productions = productions;
this.context = context;
}
@Override
public int getCount() {
return productions.size();
}
@Override
public Object getItem(int position) {
return productions.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获取到ListView的子项
convertView = LayoutInflater.from(context).inflate(R.layout.activity_list_view_item, null);
//获取组装item控件,这里是一个图片,俩个文本
ImageView tv_img = convertView.findViewById(R.id.img);
TextView tv_title = convertView.findViewById(R.id.goodname);
TextView tv_price = convertView.findViewById(R.id.pricenum);
Button purchase = convertView.findViewById(R.id.buy);
//待组装的每一个item的bean,从bean中取出数据
Production production = productions.get(position);
Integer imgId = production.getIngId();
String title = production.getTitle();
Double price = production.getPrice();
//设置数据
tv_img.setImageResource(imgId);
tv_title.setText(title);
tv_price.setText(String.valueOf(price));
purchase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "点的是第" + (position + 1) + "行", Toast.LENGTH_LONG).show();
}
});
return convertView;
}
}
ListViewActivity
- 在这里主要负责数据的传输和适配器的绑定
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.example.androidtest.R;
import java.util.ArrayList;
import java.util.List;
public class ListViewActivity extends AppCompatActivity {
private ListView listView;
private List<Production> productions = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
listView = findViewById(R.id.mylistview);
//主要的作用是封装数据
String[] title = {"商品1", "商品2", "商品3", "商品4", "商品5", "商品6"};
double[] price = {1.11, 2.22, 3.33, 4.44, 5.55, 6.66};
int[] imgId = {R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher};
productions = new ArrayList<>();
for (int i = 0;i<title.length;i++){
Production production = new Production();
production.set(title[i],price[i],imgId[i]);
productions.add(production);
}
//将数据和context通过自定义Adapter的构造方法传给Adapter
MyAdapter adapter = new MyAdapter(productions,this);
listView.setAdapter(adapter);
}
}
-
xml文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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=".ListView.ListViewActivity"> <ListView android:id="@+id/mylistview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
-
结果