Android中的ListView
生活随笔
收集整理的這篇文章主要介紹了
Android中的ListView
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 ListView概述
- 2 適配器
- 2.1 ArrayAdapter
- 2.2 SimpleAdapter
- 2.3 BaseAdapter
1 ListView概述
下面看一下ListView的應(yīng)用場景:
2 適配器
先看下適配器的使用步驟:
2.1 ArrayAdapter
效果如下:
代碼也十分簡單:
2.2 SimpleAdapter
先看下要實(shí)現(xiàn)的效果:
首先我們要自定義列表顯示的layout:
然后定義Activity對應(yīng)的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);//實(shí)例化適配器對象//參數(shù)1:this//參數(shù)2:數(shù)據(jù)源initData();//參數(shù)3:每一項(xiàng)布局//參數(shù)4:數(shù)據(jù)來源的key數(shù)組String[] from = {"img","name","mood"};//參數(shù)5:數(shù)據(jù)去向的id數(shù)組int[] to = {R.id.qq_img,R.id.qq_name,R.id.qq_mood};//參數(shù)45對應(yīng)索引上,from數(shù)組的元素代碼數(shù)據(jù)源每個map的key,該key所指代的數(shù)據(jù)//會作為to數(shù)組對應(yīng)索引上id所代表的控件的內(nèi)容顯示處理SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.item3,from,to);//為ListView設(shè)置適配器listView2.setAdapter(adapter);//點(diǎn)擊事件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","寧教我負(fù)天下人,休教天下人負(fù)我");Map<String,Object> map2 = new HashMap<>();map2.put("img",R.mipmap.zhenji);map2.put("name","甄姬");map2.put("mood","飄搖兮若流風(fēng)之回雪,仿佛兮若輕云之蔽月");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","寧教我負(fù)天下人,休教天下人負(fù)我");Map<String,Object> map6 = new HashMap<>();map6.put("img",R.mipmap.zhenji);map6.put("name","甄姬");map6.put("mood","飄搖兮若流風(fēng)之回雪,仿佛兮若輕云之蔽月");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
下面先看下要實(shí)現(xiàn)的效果:
首先看下主頁面的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"><!--頭像,昵稱,發(fā)表時(shí)間(靜態(tài)),發(fā)表內(nèi)容,點(diǎn)贊,評論,轉(zhuǎn)發(fā)--><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>這里我們需要定義一個實(shí)體類,實(shí)體類如下:
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;//根據(jù)準(zhǔn)備好的數(shù)據(jù)源和子項(xiàng)布局完成ListView效果的一一設(shè)置 //做出一些細(xì)節(jié)處理 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;}//獲取數(shù)量(設(shè)置ListView的長度)@Overridepublic int getCount() {return list.size();}//獲取視圖(設(shè)置ListView每一項(xiàng)的顯示效果)--每個視圖出現(xiàn)時(shí)都會執(zhí)行@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {//完成對view的設(shè)置//將布局資源轉(zhuǎn)為View//參數(shù)1:你所要引用的布局資源//RecycleBinViewHolder holder;if(view == null) {Log.e("TAG", "======" + i);//優(yōu)化1:利用進(jìn)入RecycleBin中的View,減少讀view的賦值 (數(shù)據(jù)項(xiàng)看不到時(shí)相關(guān)視圖就會進(jìn)入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操作//而事實(shí)上,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());//內(nèi)容 // TextView content = view.findViewById(R.id.content);holder.content.setText(m.getContent());//是否點(diǎn)贊 // 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,"你點(diǎn)擊了評論",Toast.LENGTH_SHORT).show();}});//轉(zhuǎn)發(fā) // ImageView repost = view.findViewById(R.id.repost);holder.repost.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"--------轉(zhuǎn)發(fā)----------",Toast.LENGTH_SHORT).show();}});return view;}//==============================================醬油方法//獲取子項(xiàng)@Overridepublic Object getItem(int i) {return null;}//獲取子項(xiàng)id@Overridepublic long getItemId(int i) {return 0;}//1.自定義一個類,叫做ViewHolder//2.將需要保存的視圖聲明為公開的屬性//3.什么時(shí)候保存?當(dāng)view為null時(shí),完成對ViewHolder的實(shí)例化工作,并為各個控件屬性賦值//4.什么時(shí)候用? 什么時(shí)候都要用(性能的提升是在view不為null時(shí)體現(xiàn),滾動ListView時(shí)體現(xiàn))//5.怎么用?當(dāng)view為null時(shí),完成了ViewHolder及內(nèi)部控件屬性的初始化工作后,調(diào)用一句代碼//view.setTag(holder);//當(dāng)view不為null時(shí),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();//需要傳的參數(shù):環(huán)境,數(shù)據(jù)源adapter = new MyAdapter(list,this);//設(shè)置適配器listView3.setAdapter(adapter);write.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Msg m = new Msg(R.mipmap.profile9,"paradox","這是動態(tài)新增的說說",false);list.add(m);//通知適配器更新數(shù)據(jù)adapter.notifyDataSetChanged();//設(shè)置listview自動顯示到最新數(shù)據(jù)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,"今天天氣好晴朗,慕課處處好風(fēng)光"+i,i%2==0?true:false);list.add(m);}} }我們可以看到在ListView中進(jìn)行了2個優(yōu)化。ViewHolder通常出現(xiàn)在適配器里,為的是listview滾動的時(shí)候快速設(shè)置值,而不必每次都重新創(chuàng)建很多對象,從而提升性能。
總結(jié)
以上是生活随笔為你收集整理的Android中的ListView的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部分5G机型频频断货 你换手机了吗
- 下一篇: Android中的ViewPager2