您好,登錄后才能下訂單哦!
本文實例為大家分享了Android ListView實現圖文列表顯示的具體代碼,供大家參考,具體內容如下
目標效果:
ListView如果內容過多,可以滑動屏幕來顯示,并且點擊某一行可使用吐司方法彈出對應的水果名字。
1.新建項目,新建entity實體類包,包中建存儲每行水果信息的Fruit類。
Fruit.java頁面:
package com.example.entity; public class Fruit { private int imageId; //使用id鎖定水果圖片 private String imageName; //對應的水果名字 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.一個ListView中有多行信息,每行信息可以看成一個LinearLayout子布局,子布局中有兩個控件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類,添加適配器,連接布局和數據。
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> { // 適配器,泛型表示想要適配的數據類型 private int resourceId; public FruitAdaoper(Context context, int textViewResourceId, List<Fruit> objects) { // 第一個參數是上下文環境,第二個參數是每一項的子布局,第三個參數是數據 super(context, textViewResourceId, objects); resourceId = textViewResourceId; //獲取子布局 } @Override //getView方法在每個子項被滾動到屏幕內的時候都會被調用,每次都將布局重新加載一邊 public View getView(int position, View convertView, ViewGroup parent) {//第一個參數表示位置,第二個參數表示緩存布局,第三個表示綁定的view對象 View view; ViewHolder viewHolder; //實例ViewHolder,當程序第一次運行,保存獲取到的控件,提高效率 if(convertView==null){ viewHolder=new ViewHolder(); view = LayoutInflater.from(getContext()).inflate(//convertView為空代表布局沒有被加載過,即getView方法沒有被調用過,需要創建 resourceId, null); // 得到子布局,非固定的,和子布局id有關 viewHolder.ivImage = (ImageView) view.findViewById(R.id.ivImage);//獲取控件,只需要調用一遍,調用過后保存在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);//實例指定位置的水果 viewHolder.ivImage.setImageResource(fruit.getImageId());//獲得指定位置水果的id viewHolder.tvName.setText(fruit.getImageName()); //獲得指定位置水果的名字 return view; } } class ViewHolder{ //當布局加載過后,保存獲取到的控件信息。 ImageView ivImage; TextView tvName; }
5.在MainActivity.java頁面初始化數據信息,并添加點擊每一行的點擊事件。
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>(); //創建集合保存水果信息 @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); //關聯數據和子布局 lvFruits.setAdapter(fruitAdapter); //綁定數據和適配器 lvFruits.setOnItemClickListener(new OnItemClickListener() { //點擊每一行的點擊事件 @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Fruit fruit=fruitList.get(position); //獲取點擊的那一行 Toast.makeText(MainActivity.this,fruit.getImageName(),Toast.LENGTH_LONG).show();//使用吐司輸出點擊那行水果的名字 } }); } 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++){ //將數據添加到集合中 fruitList.add(new Fruit(imageIds[i],names[i])); //將圖片id和對應的name存儲到一起 } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
6.運行就可以出現目標效果了。
7.注意FruitAdaopter.java類中的getView方法在每個子項被滾動到屏幕內的時候都會被調用,每次都將布局重新加載一邊,所以為了提高效率可以進行判斷,如果程序運行過一次就將布局保存在參數convertView中。
8.同樣,getView中的獲取控件id如果每次運行都要執行,會降低效率,所以也需要定義ViewHolder類存儲獲取的控件信息,當第一次運行時執行findViewById()后,將所有的控件信息保存到實例的ViewHolder中,后邊每次進行調用即可。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。