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);
}
}