Android中的ListView
生活随笔
收集整理的這篇文章主要介紹了
Android中的ListView
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 ListView概述
- 2 適配器
- 2.1 ArrayAdapter
- 2.2 SimpleAdapter
- 2.3 BaseAdapter
1 ListView概述
下面看一下ListView的應用場景:
2 適配器
先看下適配器的使用步驟:
2.1 ArrayAdapter
效果如下:
代碼也十分簡單:
2.2 SimpleAdapter
先看下要實現的效果:
首先我們要自定義列表顯示的layout:
然后定義Activity對應的Layout:
<?xml version="1.0" encoding="utf-8"?> <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"tools:context=".SimpleActivity"><ListViewandroid:id="@+id/list_view2"android:layout_width="match_parent"android:layout_height="match_parent"></ListView> </androidx.constraintlayout.widget.ConstraintLayout>然后看下Java代碼:
package com.example.listviewdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class SimpleActivity extends AppCompatActivity {private List<Map<String,Object>> data = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple);//獲取ListView對象ListView listView2 = findViewById(R.id.list_view2);//實例化適配器對象//參數1:this//參數2:數據源initData();//參數3:每一項布局//參數4:數據來源的key數組String[] from = {"img","name","mood"};//參數5:數據去向的id數組int[] to = {R.id.qq_img,R.id.qq_name,R.id.qq_mood};//參數45對應索引上,from數組的元素代碼數據源每個map的key,該key所指代的數據//會作為to數組對應索引上id所代表的控件的內容顯示處理SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.item3,from,to);//為ListView設置適配器listView2.setAdapter(adapter);//點擊事件listView2.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {//用Toast提示Name MoodMap<String,Object> map = data.get(i);String name = map.get("name").toString();String mood = map.get("mood").toString();Toast.makeText(SimpleActivity.this,name+" "+mood,Toast.LENGTH_SHORT).show();}});}public void initData(){//左邊:頭像 右上:名字 右下:心情Map<String,Object> map1 = new HashMap<>();map1.put("img",R.mipmap.caocao);map1.put("name","曹操");map1.put("mood","寧教我負天下人,休教天下人負我");Map<String,Object> map2 = new HashMap<>();map2.put("img",R.mipmap.zhenji);map2.put("name","甄姬");map2.put("mood","飄搖兮若流風之回雪,仿佛兮若輕云之蔽月");Map<String,Object> map3 = new HashMap<>();map3.put("img",R.mipmap.simayi);map3.put("name","司馬懿");map3.put("mood","無奈天命之子");Map<String,Object> map4 = new HashMap<>();map4.put("img",R.mipmap.guojia);map4.put("name","郭嘉");map4.put("mood","哦");Map<String,Object> map5 = new HashMap<>();map5.put("img",R.mipmap.caocao);map5.put("name","曹操");map5.put("mood","寧教我負天下人,休教天下人負我");Map<String,Object> map6 = new HashMap<>();map6.put("img",R.mipmap.zhenji);map6.put("name","甄姬");map6.put("mood","飄搖兮若流風之回雪,仿佛兮若輕云之蔽月");Map<String,Object> map7 = new HashMap<>();map7.put("img",R.mipmap.simayi);map7.put("name","司馬懿");map7.put("mood","無奈天命之子");Map<String,Object> map8 = new HashMap<>();map8.put("img",R.mipmap.guojia);map8.put("name","郭嘉");map8.put("mood","哦");data.add(map1);data.add(map2);data.add(map3);data.add(map4);data.add(map5);data.add(map6);data.add(map7);data.add(map8);} }2.3 BaseAdapter
下面先看下要實現的效果:
首先看下主頁面的xml文件:
然后看下item的xml文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><!--頭像,昵稱,發表時間(靜態),發表內容,點贊,評論,轉發--><ImageViewandroid:id="@+id/profile"android:layout_width="80dp"android:layout_height="80dp"android:src="@mipmap/profile1"android:layout_margin="5dp"/><TextViewandroid:id="@+id/nickname"android:layout_width="match_parent"android:layout_height="40dp"android:text="用戶1"android:textSize="26sp"android:layout_toRightOf="@id/profile"android:layout_marginTop="5dp"/><TextViewandroid:layout_width="match_parent"android:layout_height="40dp"android:text="2048-10-24"android:textSize="22sp"android:layout_toRightOf="@id/profile"android:layout_below="@id/nickname"/><TextViewandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="啊,多么有意義的日子呀!!"android:textSize="22sp"android:layout_below="@id/profile"/><ImageViewandroid:id="@+id/repost"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/repost"android:layout_below="@id/content"android:layout_alignParentRight="true"android:layout_marginRight="10dp"/><ImageViewandroid:id="@+id/comment"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/comment"android:layout_below="@id/content"android:layout_toLeftOf="@id/repost"android:layout_marginRight="10dp"/><ImageViewandroid:id="@+id/like"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/like"android:layout_below="@id/content"android:layout_toLeftOf="@id/comment"android:layout_marginRight="10dp"/> </RelativeLayout>這里我們需要定義一個實體類,實體類如下:
package com.example.listviewdemo;public class Msg {private int profile;private String nickname;private String content;private boolean isLike;public int getProfile() {return profile;}public void setProfile(int profile) {this.profile = profile;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isLike() {return isLike;}public void setLike(boolean like) {isLike = like;}public Msg(int profile, String nickname, String content, boolean isLike) {this.profile = profile;this.nickname = nickname;this.content = content;this.isLike = isLike;} }然后我們需要定義自己的Adapter類:
package com.example.listviewdemo;import android.content.Context; import android.util.Log; 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 android.widget.Toast;import java.util.List;//根據準備好的數據源和子項布局完成ListView效果的一一設置 //做出一些細節處理 public class MyAdapter extends BaseAdapter {private List<Msg> list;private Context ctx;public MyAdapter(List<Msg> list, Context ctx){this.list = list;this.ctx = ctx;}//獲取數量(設置ListView的長度)@Overridepublic int getCount() {return list.size();}//獲取視圖(設置ListView每一項的顯示效果)--每個視圖出現時都會執行@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {//完成對view的設置//將布局資源轉為View//參數1:你所要引用的布局資源//RecycleBinViewHolder holder;if(view == null) {Log.e("TAG", "======" + i);//優化1:利用進入RecycleBin中的View,減少讀view的賦值 (數據項看不到時相關視圖就會進入RecycleBin中)view = LayoutInflater.from(ctx).inflate(R.layout.item4, null);holder = new ViewHolder();holder.profile = view.findViewById(R.id.profile);holder.nickname = view.findViewById(R.id.nickname);holder.content = view.findViewById(R.id.content);holder.like = view.findViewById(R.id.like);holder.comment = view.findViewById(R.id.comment);holder.repost = view.findViewById(R.id.repost);view.setTag(holder);}else{//通過getTag()取出ViewHolder對象,然后能過直接通過holder.控件的方式在外面直接操作控件//從而避免了大幅度使用findViewById操作//而事實上,getTag()本身操作效率高holder = (ViewHolder) view.getTag();}Msg m = list.get(i);//頭像 // ImageView profile = view.findViewById(R.id.profile);holder.profile.setImageResource(m.getProfile());//昵稱 // TextView nickname = view.findViewById(R.id.nickname);holder.nickname.setText(m.getNickname());//內容 // TextView content = view.findViewById(R.id.content);holder.content.setText(m.getContent());//是否點贊 // ImageView like = view.findViewById(R.id.like);if(m.isLike()){holder.like.setImageResource(R.mipmap.liked);}else{holder.like.setImageResource(R.mipmap.like);}//評論 // ImageView comment = view.findViewById(R.id.comment);holder.comment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"你點擊了評論",Toast.LENGTH_SHORT).show();}});//轉發 // ImageView repost = view.findViewById(R.id.repost);holder.repost.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"--------轉發----------",Toast.LENGTH_SHORT).show();}});return view;}//==============================================醬油方法//獲取子項@Overridepublic Object getItem(int i) {return null;}//獲取子項id@Overridepublic long getItemId(int i) {return 0;}//1.自定義一個類,叫做ViewHolder//2.將需要保存的視圖聲明為公開的屬性//3.什么時候保存?當view為null時,完成對ViewHolder的實例化工作,并為各個控件屬性賦值//4.什么時候用? 什么時候都要用(性能的提升是在view不為null時體現,滾動ListView時體現)//5.怎么用?當view為null時,完成了ViewHolder及內部控件屬性的初始化工作后,調用一句代碼//view.setTag(holder);//當view不為null時,holder = view.getTag();static class ViewHolder{public ImageView profile,like,comment,repost;public TextView nickname,content;} }接下來看下最后的Activity:
package com.example.listviewdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView;import java.util.ArrayList; import java.util.List;public class BaseActivity extends AppCompatActivity {private ListView listView3;private ImageView write;private List<Msg> list = new ArrayList<>();private int[] ps = {R.mipmap.profile1,R.mipmap.profile2,R.mipmap.profile3,R.mipmap.profile4,R.mipmap.profile5,R.mipmap.profile6,R.mipmap.profile7,R.mipmap.profile8};private BaseAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_base);listView3 = findViewById(R.id.list_view3);write = findViewById(R.id.write);initData();//需要傳的參數:環境,數據源adapter = new MyAdapter(list,this);//設置適配器listView3.setAdapter(adapter);write.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Msg m = new Msg(R.mipmap.profile9,"paradox","這是動態新增的說說",false);list.add(m);//通知適配器更新數據adapter.notifyDataSetChanged();//設置listview自動顯示到最新數據listView3.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);}});}private void initData() {for(int i = 1 ; i <= 8 ; i++){Msg m = new Msg(ps[i-1],"用戶"+i,"今天天氣好晴朗,慕課處處好風光"+i,i%2==0?true:false);list.add(m);}} }我們可以看到在ListView中進行了2個優化。ViewHolder通常出現在適配器里,為的是listview滾動的時候快速設置值,而不必每次都重新創建很多對象,從而提升性能。
總結
以上是生活随笔為你收集整理的Android中的ListView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部分5G机型频频断货 你换手机了吗
- 下一篇: Android中的ViewPager2