Android ListView實(shí)現(xiàn)圖文列表顯示
本文實(shí)例為大家分享了Android ListView實(shí)現(xiàn)圖文列表顯示的具體代碼,供大家參考,具體內(nèi)容如下
目標(biāo)效果:


ListView如果內(nèi)容過多,可以滑動(dòng)屏幕來顯示,并且點(diǎn)擊某一行可使用吐司方法彈出對(duì)應(yīng)的水果名字。
1.新建項(xiàng)目,新建entity實(shí)體類包,包中建存儲(chǔ)每行水果信息的Fruit類。
Fruit.java頁面:
package com.example.entity;
public class Fruit {
private int imageId; //使用id鎖定水果圖片
private String imageName; //對(duì)應(yīng)的水果名字
public Fruit(int imageId, String imageName) {
super();
this.imageId = imageId;
this.imageName = imageName;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
}
2.在activity_main.xml頁面添加ListView控件,用于顯示所有的水果即水果名稱。
activity_main.xml頁面:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lvFruits"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</RelativeLayout>
3.一個(gè)ListView中有多行信息,每行信息可以看成一個(gè)LinearLayout子布局,子布局中有兩個(gè)控件ImageView和TextView,按照水平排列。
listview_item.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/ivImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tvName"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
4.新建adaptor包,包中建FruitAdaopter.java類,添加適配器,連接布局和數(shù)據(jù)。
FruitAdaopter.java頁面:
package com.example.adapter;
import java.util.List;
import com.example.entity.Fruit;
import com.example.listview.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class FruitAdaoper extends ArrayAdapter<Fruit> { // 適配器,泛型表示想要適配的數(shù)據(jù)類型
private int resourceId;
public FruitAdaoper(Context context, int textViewResourceId,
List<Fruit> objects) { // 第一個(gè)參數(shù)是上下文環(huán)境,第二個(gè)參數(shù)是每一項(xiàng)的子布局,第三個(gè)參數(shù)是數(shù)據(jù)
super(context, textViewResourceId, objects);
resourceId = textViewResourceId; //獲取子布局
}
@Override //getView方法在每個(gè)子項(xiàng)被滾動(dòng)到屏幕內(nèi)的時(shí)候都會(huì)被調(diào)用,每次都將布局重新加載一邊
public View getView(int position, View convertView, ViewGroup parent) {//第一個(gè)參數(shù)表示位置,第二個(gè)參數(shù)表示緩存布局,第三個(gè)表示綁定的view對(duì)象
View view;
ViewHolder viewHolder; //實(shí)例ViewHolder,當(dāng)程序第一次運(yùn)行,保存獲取到的控件,提高效率
if(convertView==null){
viewHolder=new ViewHolder();
view = LayoutInflater.from(getContext()).inflate(//convertView為空代表布局沒有被加載過,即getView方法沒有被調(diào)用過,需要?jiǎng)?chuàng)建
resourceId, null); // 得到子布局,非固定的,和子布局id有關(guān)
viewHolder.ivImage = (ImageView) view.findViewById(R.id.ivImage);//獲取控件,只需要調(diào)用一遍,調(diào)用過后保存在ViewHolder中
viewHolder.tvName = (TextView) view.findViewById(R.id.tvName); //獲取控件
view.setTag(viewHolder);
}else{
view=convertView; //convertView不為空代表布局被加載過,只需要將convertView的值取出即可
viewHolder=(ViewHolder) view.getTag();
}
Fruit fruit = getItem(position);//實(shí)例指定位置的水果
viewHolder.ivImage.setImageResource(fruit.getImageId());//獲得指定位置水果的id
viewHolder.tvName.setText(fruit.getImageName()); //獲得指定位置水果的名字
return view;
}
}
class ViewHolder{ //當(dāng)布局加載過后,保存獲取到的控件信息。
ImageView ivImage;
TextView tvName;
}
5.在MainActivity.java頁面初始化數(shù)據(jù)信息,并添加點(diǎn)擊每一行的點(diǎn)擊事件。
MainActivity.java頁面:
package com.example.listview;
import java.util.ArrayList;
import java.util.List;
import com.example.adapter.FruitAdaoper;
import com.example.entity.Fruit;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lvFruits;
private List<Fruit> fruitList = new ArrayList<Fruit>(); //創(chuàng)建集合保存水果信息
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvFruits = (ListView) findViewById(R.id.lvFruits); //獲得子布局
getData();
FruitAdaoper fruitAdapter = new FruitAdaoper(this,
R.layout.listview_item, fruitList); //關(guān)聯(lián)數(shù)據(jù)和子布局
lvFruits.setAdapter(fruitAdapter); //綁定數(shù)據(jù)和適配器
lvFruits.setOnItemClickListener(new OnItemClickListener() { //點(diǎn)擊每一行的點(diǎn)擊事件
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
Fruit fruit=fruitList.get(position); //獲取點(diǎn)擊的那一行
Toast.makeText(MainActivity.this,fruit.getImageName(),Toast.LENGTH_LONG).show();//使用吐司輸出點(diǎn)擊那行水果的名字
}
});
}
private void getData() {
int[] imageIds = { R.drawable.apple_pic, R.drawable.banana_pic,
R.drawable.cherry_pic, R.drawable.grape_pic,
R.drawable.mango_pic, R.drawable.orange_pic,
R.drawable.pear_pic, R.drawable.pineapple_pic,
R.drawable.strawberry_pic, R.drawable.watermelon_pic };
String[] names = { "蘋果", "香蕉", "櫻桃", "葡萄", "芒果", "橘子", "梨", "菠蘿", "草莓",
"西瓜" };
for(int i=0;i<imageIds.length;i++){ //將數(shù)據(jù)添加到集合中
fruitList.add(new Fruit(imageIds[i],names[i])); //將圖片id和對(duì)應(yīng)的name存儲(chǔ)到一起
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
6.運(yùn)行就可以出現(xiàn)目標(biāo)效果了。
7.注意FruitAdaopter.java類中的getView方法在每個(gè)子項(xiàng)被滾動(dòng)到屏幕內(nèi)的時(shí)候都會(huì)被調(diào)用,每次都將布局重新加載一邊,所以為了提高效率可以進(jìn)行判斷,如果程序運(yùn)行過一次就將布局保存在參數(shù)convertView中。
8.同樣,getView中的獲取控件id如果每次運(yùn)行都要執(zhí)行,會(huì)降低效率,所以也需要定義ViewHolder類存儲(chǔ)獲取的控件信息,當(dāng)?shù)谝淮芜\(yùn)行時(shí)執(zhí)行findViewById()后,將所有的控件信息保存到實(shí)例的ViewHolder中,后邊每次進(jìn)行調(diào)用即可。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義圓形View實(shí)現(xiàn)小球跟隨手指移動(dòng)效果
- Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡(luò)圖片的實(shí)現(xiàn)代碼
- Android自定義圓形倒計(jì)時(shí)進(jìn)度條
- Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
- Android列表組件ListView使用詳解之動(dòng)態(tài)加載或修改列表數(shù)據(jù)
- Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問題
- Android 實(shí)現(xiàn)自定義圓形listview功能的實(shí)例代碼
相關(guān)文章
android非RxJava環(huán)境下使用Handler實(shí)現(xiàn)預(yù)加載
這篇文章主要介紹了android非RxJava環(huán)境下使用Handler實(shí)現(xiàn)預(yù)加載的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android BottomNavigationBar底部導(dǎo)航的使用方法
Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例
Android中分析Jetpack?Compose動(dòng)畫內(nèi)部的實(shí)現(xiàn)原理
Android Studio4.0導(dǎo)入OpenCv4.3.0的方法步驟
android中TabHost的圖標(biāo)(48×48)和文字疊加解決方法
Android?Studio調(diào)試Gradle插件詳情
Android項(xiàng)目實(shí)現(xiàn)視頻播放器

