Listview
生活中我们常见的qq,微信消息界面,联系人界面都是用Listview来实现的,而简单的List view 只能显示一串文字,我们怎样可以自定义列表内容并且赋值给它呢?
那就用到了Adapter适配器,下面看一下代码:
主页的布局文件不多说了,只包含了一个ListView组件。
然后我们为列表的item样式设计一个布局:
左边一个图片,右边有上下两行信息。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_margin="14dp"
android:layout_width="50dp" android:layout_height="50dp"/>
<LinearLayout android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:textSize="20dp"
android:textColor="#000000"
android:layout_marginTop="15dp"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/message"
android:layout_width="wrap_content"
android:textColor="#5e5c5c"
android:layout_marginBottom="6dp"
android:layout_height="wrap_content"/>
</LinearLayout>
做完布局之后,我们还需要新建一个相应的实体类来为它赋值。
.java文件:
我们只要在类名地方右键点击generate,就会弹出相应的构造,get,set方法,非常方便。
package com.example.myapplication;
public class ListItem {
private String name ;
private int imageId;
private String mes;
public String getMes() {
return mes;
}
public ListItem(String name, int imageId, String mes) {
this.name = name;
this.imageId = imageId;
this.mes = mes;
}
public String getName() {
return name;
}
public int getImageId() {
return imageId;
}
}
接下来,我们要写Adapter来为list赋值了。
public class ListAdapter extends ArrayAdapter<ListItem> {
private int resourceId;
public ListAdapter(@NonNull Context context, int resource, @NonNull List<ListItem> objects) {
super(context, resource, objects);
resourceId = resource;
}
class ViewHolder {
ImageView imageView;
TextView textView1;
TextView textView2;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ListItem item = getItem(position);
View view;
ViewHolder viewHolder;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view.findViewById(R.id.image);
viewHolder.textView1 = (TextView) view.findViewById(R.id.name);
viewHolder.textView2 = (TextView) view.findViewById(R.id.message);
view.setTag(viewHolder);
}else{
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.imageView.setImageResource(item.getImageId());
viewHolder.textView1.setText(item.getName());
viewHolder.textView2.setText(item.getMes());
return view;
}
}
最后回到我们的主页面的java文件中,我们初始化数据,并加载布局到listview中。
public class Main2Activity extends AppCompatActivity {
private List<ListItem> items = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
init();
ListAdapter adapter = new ListAdapter(Main2Activity.this,R.layout.user_item,items);
ListView listView = (ListView)findViewById(R.id.list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ListItem item = items.get(i);
Toast.makeText(Main2Activity.this, item.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void init() {
ListItem p1 = new ListItem("张小生",R.drawable.img01,"在吗?");
items.add(p1);
ListItem p2 = new ListItem("小王",R.drawable.img02,"什么时候出去吃饭?");
items.add(p2);
ListItem p3 = new ListItem("老海",R.drawable.img03,"我刚刚出去了。");
items.add(p3);
ListItem p4 = new ListItem("王语嫣",R.drawable.img04,"拜拜");
items.add(p4);
ListItem p5 = new ListItem("衾罗因",R.drawable.img05,"晚安");
items.add(p5);
}
}