Android 第九課 常用控件-------ListView

ListView允許用戶通過手指上下滑動的方式將屏幕外的數據滾動到屏幕內,同時屏幕上原有數據將會滾動出屏幕。

1、ListView簡單用法

如何將ListView將你要顯示的大量內容關聯起來呢?這是個很重要的問題。

1、首先我們必須先將數據提供好,因為你的目的是要用ListView來展示數據嘛。我們先用一個數組來保存數據。

2、那么數組中的數據怎么才能傳遞給ListView呢?我們通過適配器來完成,Android中有很多適配器的實現類,比較好用的就是ArrayAdapter。它可以通過泛型來指定更適配的數據類型,然后在構造函數中把要適配的數據傳入。ArrayAdapter有多個構造函數的重載,可以選擇合適的一個。

3、要調用ListView地setAdapter()方法,將構建好的適配器對象傳遞進去、這樣ListView和數據之間地關聯就建立好了。

詳細步驟:

新建一個ListViewTest項目,讓AS自動創建好默認活動。假如目前活動已經創建好。

修改activity_main.xml中的代碼,(在布局中添加ListView控件),如下:

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="com.example.listviewtest.MainActivity"> <ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout>

修改MainActivity中的代碼,如下:

package com.example.listviewtest;import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;import org.w3c.dom.Text;import java.util.List;public class MainActivity extends AppCompatActivity {private String[] data = {"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13","A14","A15","A16","A17","A18","A19","A20","A21","A22","A23","A24"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);}
}


ListView是用來展示大量數據的,我們應該先將數據提供好,這些數據可以是從網上下載的,也可以是從數據庫中讀取的。

我們只是使用一個data數組來測試。

不過,數組中的數據是無法直接傳遞給ListView的,我們需要借助適配器來完成。Android 中提供了很多適配器的實現類,比較好用的就是ArrayAdapter它可以通過泛型來指定要適配的數據類型,然后在構造函數中把要適配的數據傳入。ArrayAdapter有多個構造函數的重載,我們選擇比較適合的一種。這里由于我們提供的數據都是字符串,因此將ArrayAdapter的泛型指定為String,然后在ArrayAdapter的構造函數中依次傳入當前的上下文,ListView子項布局的id,以及要適配的數據。

注意:這里我們使用了android.R.layout.simple_list_item_1作為ListView子項布局的id,這是一個Android內置的布局文件,里面只有一個TextView,可用于簡單地顯示一段文本。

最后,我們還需要調用ListView地setAdapter()方法,將構建好的適配器對象傳遞進去、這樣ListView和數據之間地關聯就建立好了。

運行程序如下:


2、定制ListView的界面

只能夠顯示一段文本的ListView實在是太單調了,我們對ListView的界面進行定制,讓它可以顯示更加豐富的內容。

我們可以讓這些名稱的旁邊顯示一個圖樣。

定義一個實體類Fruit,作為ListView適配器的適配類型,新建Fruit,代碼如下:

package com.example.listviewtest;public class Fruit {private String name;private int imageId;public Fruit(String name, int imageId) {this.name = name;this.imageId = imageId;}public String getName() {return name;}public int getImageId() {return imageId;}}

Fruit類中只有兩個字段,name表示水果的名字,imageId表示水果對圖片的資源id。

ListView的子項指定為一個我們呢我自定義的布局,在layout目錄下新建fruit_item.xml,代碼如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp" /></LinearLayout>


我們定義了一個ImageView用于顯示水果的圖片,又定義了一個TextView用于顯示水果的名稱,并讓TextView在垂直方向上水平居中。

接下來,需要創建一個自定義的適配器,這個設配器繼承自ArrayAdapter,并將泛型指定為Fruit。新建FruitAdapter,

代碼如下:


package com.example.listviewtest;import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;import java.util.List;/*** Created by ZHJ on 2018/3/3.*/public class FruitAdapter extends ArrayAdapter<Fruit> {private  int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){super(context,textViewResourceId,objects);resourceId = textViewResourceId;}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Fruit fruit = getItem(position);View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);TextView fruitName =(TextView)  view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId());fruitName.setText(fruit.getName());return view;}
}

FruitAdapter重寫了父類的一組構造函數,用于將上下文、ListView子項布局的id和數據都傳遞進來。另外又重寫了getView()方法,這個方法在每個子項被滾動到屏幕內的時候被調用。

在getView()方法中,

? ? 1、首先通過getItem()方法得到當前項的Fruit實例,

????2、然后使用LayoutInflater來為這個子項加載我們傳入的布局。LayoutInflater的inflate()方法接收3個參數,第一個參數是要加載的布局文件的id,第二個參數是給加載好的布局再添加一個父布局,第三個參數,我們指定為false,表示只讓我們在父布局中聲明的layout屬性生效,但不會為這個View添加父布局

調用View的findViewById()方法分別獲取ImageView和TextView的實例,并分別調用它們的setImageResource()setText()方法來設置顯示的圖片和文字

接著修改MainActivity中的代碼,如下:

package com.example.listviewtest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<Fruit>();//新建對象實例
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); initFruits(); // 初始化水果數據FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);//傳入上下文、子項布局的id、數據ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Fruit fruit = fruitList.get(position);Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();}});}private void initFruits() {for (int i = 0; i < 2; i++) {Fruit apple = new Fruit("Apple", R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit("Banana", R.drawable.banana_pic);fruitList.add(banana);Fruit orange = new Fruit("Orange", R.drawable.orange_pic);fruitList.add(orange);Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit("Pear", R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit("Grape", R.drawable.grape_pic);fruitList.add(grape);Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit("Mango", R.drawable.mango_pic);fruitList.add(mango);
        }}}

可以看到這里添加了一個initFruits()方法,用于初始化所有的水果數據。在Fruit類中的構造函數將水果的名字和對應的圖片id傳入,然后把創建好的對象添加到水果列表中。

另外使用了一個for循環將所有的水果數據添加了兩遍,只添加一遍數據還不足以充滿整個屏幕。接著在onCreate()方法中創建了FruiteAdapter對象,并將FruitAdapter作為適配器傳遞給ListView,這樣ListView界面就完成了。

提升ListView的運行效率

之所以說ListView這個控件很難運用,因為它有很多細節可以優化,其中運行效率就是很重要的一點。目前,我們的運行效率是很低的,因為在FruitAdapter的getView()方法中,每次都將布局重新加載了一遍,當ListView快速滾動的時候,這就會成為性能的瓶頸。

仔細觀察會發現,getView()方法中還有一個convertView參數,這個參數用于將之前加載好的布局進行緩存,一遍日后重用,修改FruitAdapter中的代碼,如下:

package com.example.listviewtest;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;import java.util.List;public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;//用來計數public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}//構造函數@Overridepublic View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); // 獲取當前項的Fruit實例View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);viewHolder = new ViewHolder();viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);view.setTag(viewHolder); // 將ViewHolder存儲在View中 } else {view = convertView;viewHolder = (ViewHolder) view.getTag(); // 重新獲取ViewHolder}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());return view;} class ViewHolder {ImageView fruitImage;TextView fruitName;}}



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274116.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Singleton patterns 單件(創建型模式)

1、模式分類 1.1 從目的來看&#xff1a; ? – 創建型&#xff08;Creational&#xff09;模式&#xff1a;負責對象創建。 ? – 結構型&#xff08;Structural&#xff09;模式&#xff1a;處理類與對象間的組合。 ? – 行為型&#xff08;Behavioral&…

Android 第十一課 SQlite 數據庫存儲

Android 為了讓我們能夠更加方便的管理數據庫&#xff0c;特意提供了一個SQLiteOpenHelper幫助類&#xff0c;通過借助這個類就可以非常簡單的對數據庫進行創建和升級。 SQLiteOpenHelper是一個抽象類&#xff0c;我們要創建一個自己的幫助類去繼承它。SQLiteOpenHelper有兩個抽…

淺析SQL Server 2005中的主動式通知機制

一、引言 在開發多人同時訪問的Web應用程序&#xff08;其實不只這類程序&#xff09;時&#xff0c;開發人員往往會在緩存策略的設計上狠下功夫。這是因為&#xff0c;如果將這種環境下不常變更的數據臨時存放在應用程序服務器或是用戶機器上的話&#xff0c;可以避免頻繁地往…

Android 第十二課 使用LitePal操作數據庫(記得閱讀最后面的注意事項哦)

一、LitePal簡介 1、(新建項目LitePalTest)正式接觸第一個開源庫---LitePalLitePal是一款開源的Android 數據庫框架&#xff0c;它采用了對象關系映射&#xff08;ORM&#xff09;的模式。2、配置LitePal&#xff0c;編輯app/build.gradle文件&#xff0c;在dependencies閉包中…

listview頻繁刷新報錯

在Android編程中使用Adapter時&#xff0c;偶爾會出現如下錯誤&#xff1a;The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI t…

Android 第十三課 SharedPreferences存儲

SharedPreferences是使用鍵值對的方式來存儲數據的。當保存一條數據時&#xff0c;需要給這條數據提供一個對應的鍵&#xff0c;這樣在讀取數據的時候就可以通過這個鍵把相應的值取出來。而且支SharedPreferences還支持多種不同的數據類型存儲&#xff0c;例如&#xff1a;如果…

DSP的Gel作用

轉自&#xff1a;http://blog.csdn.net/azhgul/article/details/6660960最近剛在研究Davinci系&#xff0c;特此MARK下&#xff0c;以資后續學習之用。 DSP的Gel作用 1 GEL文件基本作用 當CCSStudio啟動時&#xff0c;GEL文件加載到PC機的內存中&#xff0c;如果定義了StartUp(…

解決關于登錄校園網顯示不在IP段的問題方案(要看注意事項哦!)

有時&#xff0c;登錄校園網&#xff0c;賬號和密碼都顯示正確&#xff0c;但是卻顯示出“賬號只能在指定IP段登錄”的問題。 那我們就提供了一個解決方案&#xff1a; 使用WinR,并在輸入框&#xff0c;輸入cmd命令&#xff1a;&#xff08;如下&#xff09;接著輸入&#xff1…

jquery插件編寫

jQuery為開發插件提拱了兩個方法&#xff0c;分別是&#xff1a; jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 為擴展jQuery類本身.為類添加新的方法。可以理解為添加靜態方法。是全局的&#xff08;位于jQuery命名空間內部的函數&#xff09;…

gtk/Glade編程 編譯命令不成功 解決方法

摘自&#xff1a;http://blog.chinaunix.net/uid-26746982-id-3433656.html 當我們編寫gtk/glade程序&#xff0c;gcc編譯時&#xff0c;用如下命令&#xff1a; #gcc -o server server.c pkg-config --cflags --libs gtk-2.0 報錯&#xff1a;/tmp/ccoXadAd.o: In function …

Android 第十五課 如何使用LitePal從SQLite數據庫中刪除數據(十四課用來保留講解如何向SQLite數據庫中存入數據)

使用LitePal刪除數據的方式主要有兩種&#xff0c;第一種就是直接調用已存對象的delete()方法&#xff0c;所謂已存儲對象就是調用過save()方法的對象&#xff0c;或者說是通過LitePal提供的查詢API查出來的對象&#xff0c;都是可以直接使用delete方法來刪除對象的。這是比較簡…

頁面返回頂部(方法比較)

下面就說下簡單的返回頂部效果的代碼實現&#xff0c;附注釋說明。 1. 最簡單的靜態返回頂部&#xff0c;點擊直接跳轉頁面頂部&#xff0c;常見于固定放置在頁面底部返回頂部功能 方法一&#xff1a;用命名錨點擊返回到頂部預設的id為top的元素 html代碼 <a href"#top…

Android 第十六課 使用LitePal查詢數據

LitePal在查詢API方面做了非常多的優化&#xff0c;基本上可以滿足絕大多數場景的查詢需求&#xff0c;并且代碼也十分整潔。 例如我們需要查詢表中的所有數據&#xff1a; List<books> DataSupport.findAll(Book.class); 沒有冗長的參數列表&#xff0c;只需要調用一下…

linux創建桌面圖標,和開始菜單欄圖標

轉自&#xff1a;http://blog.csdn.net/qq_25773973/article/details/50514767 ###環境&#xff1a;Mint17&#xff0c;&#xff08;其他類似的linux系統是一樣的&#xff09; 如果開始菜單有圖標&#xff0c;創建桌面圖標很簡單&#xff0c;右鍵添加到桌面即可。 如果沒有&am…

ScrollView中使用ListView

轉自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存&#xff0c;在scrollview中直接使用lsitview的話只會顯示一個條目&#xff0c;要使他們共存&#xff0c; 據我所知&#xff0c;有三種方法&#xff1a; 1。如果listview的高度…

Android 第十四課 使用LitePal添加數據(更新數據)

我們注意到當你登錄一個app&#xff0c;是不是需要先注冊呢&#xff1f;&#xff0c;所謂注冊&#xff0c;簡單地來理解是不是就是把輸入框中地數據傳入數據庫中呢&#xff1f; 這里我們設置簡單一點&#xff0c;注冊的信息只包括兩項&#xff0c;一項是用戶名&#xff0c;另一…

微信公眾平臺的服務號和訂閱號

微信公眾平臺 服務號 訂閱號 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html 什么是服務號&#xff1f; 服務號給企業和組織提供更強大的業務服務與用戶管理能力&#xff0c;幫助企業快速實現全新的公眾…

Android 第十七課 碎片的簡單用法及動態添加碎片

Fragment(碎片)是一種可以嵌入在活動當中的UI片段&#xff0c;它可以讓程序更加合理和充分的利用大屏幕的空間。碎片和活動太像了&#xff0c;同樣都包含布局&#xff0c;都有自己的聲明周期&#xff0c;可以將碎片理解為一種迷你型的活動。 新建FragmentTest項目。假設項目已經…

在Linux下禁用鍵盤、鼠標、觸摸板(筆記本)等輸入設備

在Linux系統下禁用鍵盤、觸摸板、鼠標等輸入設備&#xff0c;可以通過xinput命令來實現&#xff1a;主要涉及&#xff1a;#xinput list#xinput list-props list-number#xinput set-prop list-number func-number 1/0具體操作如下&#xff1a;step1&#xff1a;查看系統中有那些…

委托又給我惹麻煩了————記委托鏈的取消注冊、獲取返回值

今天改bug碰到了一個問題&#xff0c;有多個方法注冊到了一個事件里去&#xff0c;而這些方法本身又有點兒互斥&#xff0c;因而造成了bug&#xff0c;哥調試半天才發現&#xff0c;郁悶至極&#xff0c;遂復習了以前的知識并進行適當延伸&#xff0c;再將成果記錄及分享之&…