Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發教程 --- 葵花寶典第六層 控件之 Dialog ListView GridView

Android開發教程 --- 葵花寶典第六層 控件之 Dialog ListView GridView

編輯:Android開發實例

Hi 大家好!

  今天和大家一起來學習三種控件,對話框、列表、網格視圖。

  這三種控件比較重要,使用率也比較頻繁,相對來說也比前面所講的控件復雜,希望大家多練習,熟練掌握它們。

  照例,上笑話。

  論壇樓主:帥有個屁用——到頭來還不是被卒吃掉!
  論壇回復:帥有士陪,有炮打,有馬騎,有車坐,有相暗戀……帥怎麼不好?!!

 

  Dialog 對話框,它運行起來的效果是什麼樣呢?如下圖

  

 

 這種是最常用的對話框

 

當點擊了上圖的確定後,會彈此對話框,這種對話框屬於自定義布局類型

當執行一些比較費時的操作時,用這種對話框是個不錯的選擇

當我們需要用戶進行選擇操作,又不能使用下來列表時,可以使用這種自定義布局的對話框

接下來我們就一起來看看這些通過代碼是如何實現的?

package TSD.Jason.Example;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;

/**
* 對話框
* @author Administrator
* 常用方法:
* setTitle():給對話框設置title.
setIcon():給對話框設置圖標。
setMessage():設置對話框的提示信息
setItems():設置對話框要顯示的一個list,一般用於要顯示幾個命令時
setSingleChoiceItems():設置對話框顯示一個單選的List
setMultiChoiceItems():用來設置對話框顯示一系列的復選框。
setPositiveButton():給對話框添加”Yes”按鈕。
setNegativeButton():給對話框添加”No”按鈕。
*
*/
public class DialogActivity extends Activity {
Button btn1;
ProgressDialog p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diaolg);
btn1 = (Button)findViewById(R.id.btnDialog);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Builder dialog = new AlertDialog.Builder(DialogActivity.this);
dialog.setTitle("登錄提示");
dialog.setIcon(android.R.drawable.ic_dialog_info);
dialog.setMessage("是否登錄?");
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ShowLoginDialog();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogActivity.this.finish();
}
});
dialog.show();
}
});
}
}

以上代碼是我們第一張對話框的效果實現代碼,大家發現是不是挺簡單,當我們單擊確定按鈕後,將調用一個叫做ShowLoginDialog的方法。

這個方法馬上會貼出來,在這裡我還是要強調下,大家在寫代碼的時候一定要有一個良好的編程思想,將功能拆分,降低代碼的耦合度,一個方法只做一件事情,不要一股腦的將代碼寫到一個方法裡。希望大家記得。

 

private void ShowLoginDialog()
{
Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("用戶登錄");
LayoutInflater factory = LayoutInflater.from(DialogActivity.this);
View dialogView = factory.inflate(R.layout.dialogview, null);
builder.setView(dialogView);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogWait();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogActivity.this.finish();
}
});
builder.show();
}

 

上邊被標注的代碼是為了讓Dialog中的內容部分顯示我們自定義的布局文件,通過builder對象的setView方法就可以將R.layout.dialogview這個布局文件綁定到對話框中。

布局文件代碼如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="賬號"
/>
<EditText
android:id="@+id/txtUserName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請輸入賬號"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="密碼"
/>
<EditText
android:id="@+id/txtUserPwd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="請輸入密碼"
/>
</LinearLayout>

 

第三個等待效果的對話框是如何實現的呢?上邊我們調用了一個方法叫做 DialogWait

 

    private void DialogWait()
{
p = ProgressDialog.show(DialogActivity.this, "正在登錄", "請稍後...", true);
new Thread(){
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
p.dismiss();//登錄結束後,取消對話框
}
}
}.start();

}

 

 

大家注意,此時的類就不在是AlertDialog,而是ProgressDialog。

上邊代碼我們為了測試看效果,所以開啟了一個線程,並掛起2秒,這在以後項目中是不需要的,如果大家看不太懂,那麼這裡先跳過。

接下來我們來看看如何在對話框中嵌套一個ListView。

 首先,需要一個布局文件,布局文件裡只創建一個ListView,如下代碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:scrollbars="vertical">
<ListView
android:id="@+id/listCity"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"/>
</LinearLayout>

Java代碼如下

private void ShowLoginDialog()
{
Builder builder = new AlertDialog.Builder(Tab1Activity.this);
builder.setTitle("選擇城市");
LayoutInflater factory = LayoutInflater.from(Tab1Activity.this);
View dialogView = factory.inflate(R.layout.dialogcity, null);
listCity =(ListView)dialogView.findViewById(R.id.listCity);
GetCity();
builder.setView(dialogView);
builder.show();
}

private void GetCity()
{
System.out.println("asd");
ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();
HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("city", "北京");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "上海");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "深圳");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "天津");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "南京");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "武漢");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "江蘇");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "寧波");
listData.add(hmItem);
SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, new String[]{"city"}, new int[]{android.R.id.text1});
listCity.setAdapter(sim);
}

直接調用ShowLoginDialog方法即可。注意標注的代碼,需要先獲取ListView。這裡已經用到了ListView,如果不太懂下邊就將ListView,大家注意看。

ListView

上邊已經展示過它運行的效果了,這裡就不展示運行效果了。

那麼要使用ListView需要哪些步驟呢?舉一個例子,可能不太恰當

冰箱裡沒有雞蛋了,我們從家裡提了一個籃子去超市買雞蛋。就是這樣的一個過程。我們來分解下這個步驟

冰箱 == 展示數據 == ListView

超市裡的雞蛋 == 數據 == ArrayList<E> 泛型集合

籃子 == 適配器 == SimpleAdapter

我們應該將 雞蛋(ArrayList<E>) 裝到 籃子裡(SimpleAdapter) 然後提回家 放到 冰箱裡( ListView)

分解完步驟後,那麼我們看看如何用代碼實現這個過程。

ListView userList; //聲明一個ListView對象(冰箱)

userList = (ListView)findViewById(R.id.listUserInfo); //獲取布局文件中的ListView控件賦值給ListView對象

ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>(); //數據源 (超市裝雞蛋的盒子)

HashMap<String, String> hmItem = new HashMap<String, String>(); //需要一個HashMap鍵值對 (每一個雞蛋)
  hmItem.put("userName", "張三"); 
  hmItem.put("userPhone", "1234567890");
  listData.add(hmItem); //將雞蛋裝到數據源中

String[] s = new String[2]; //列 和鍵值對中的鍵 一一對應 每個鍵值對應該是一樣的列數
  s[0] = "userName";
  s[1] = "userPhone";
  int[] i = new int[2]; //用什麼控件來裝載上邊String集合中的列 和上邊的String數組也是一一對應的
  i[0] = android.R.id.text1;
  i[1] = android.R.id.text2;
  SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, s, i); //這就是我們的籃子 
  userList.setAdapter(sim); //將籃子中的雞蛋裝到冰箱中 :)

完整的代碼如下

package TSD.Jason.Example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

/**
* ListView基本使用方法
*
* 使用ListView的基本步驟
* 1.准備ListView要顯示的數據 ;
* ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();
*
* 2.使用 一維或多維 動態數組 保存數據;
* HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("userName", "張三");
hmItem.put("userPhone", "1234567890");

* 3.構建適配器 , 簡單地來說, 適配器就是 Item數組 , 動態數組 有多少元素就生成多少個Item;
* SimpleAdapter simpleAdapter;
* 數據綁定的類
* 參數解釋
*
* 第一個context,很明顯大家根據英文可以知道是上下文的意思,它官方的意思是:SimpleAdapter所要運行關聯到的視圖,這個是什麼呢?就是你這個SimpleAdapter所在的Activity(一般而言),所以這個參數一般是this

第二個是一個泛型只要是一個List就行,這一般會想到是ArrayList,而他內部存儲的則是Map或者繼承自Map的對象,比如HashMap,這些語法都是Java的基本語法,不再詳述了!這裡呢是作為數據源,而且每一個ArraList中的一行就代表著呈現出來的一行,Map的鍵就是這一行的列名,值也是有列名的。

第三個資源文件,就是說要加載這個兩列所需要的視圖資源文件,你可以左邊一個TextView右邊一個TextView,目的在於呈現左右兩列的值!

第四個參數是一個數組,主要是將Map對象中的名稱映射到列名,一一對應

第五個是將第四個參數的值一一對象的顯示(一一對應)在接下來的int形的id數組中,這個id數組就是LayOut的xml文件中命名id形成的唯一的int型標識符

* context 關聯SimpleAdapter運行著的視圖的上下文。
data 一個Map的列表。在列表中的每個條目對應列表中的一行,應該包含所有在from中指定的條目
resource 一個定義列表項目的視圖布局的資源唯一標識。布局文件將至少應包含哪些在to中定義了的名稱。
from 一個將被添加到Map上關聯每一個項目的列名稱的列表
to 應該在參數from顯示列的視圖。這些應該全是TextView。在列表中最初的N視圖是從參數from中最初的N列獲取的值。
*
* 4.把 適配器 添加到ListView,並顯示出來。
* @author Administrator
*
*/
public class ListViewActivity extends Activity {

ListView userList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
userList = (ListView)findViewById(R.id.listUserInfo);

ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();

HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("userName", "張三");
hmItem.put("userPhone", "1234567890");
listData.add(hmItem);


hmItem = new HashMap<String, String>();
hmItem.put("userName", "李四");
hmItem.put("userPhone", "981234502");
listData.add(hmItem);




hmItem = new HashMap<String, String>();
hmItem.put("userName", "王五");
hmItem.put("userPhone", "5622435566221");
listData.add(hmItem);





//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, R.layout.textviewitem, new String[]{"userName","userPhone"}, new int[]{R.id.txtUserName,R.id.txtUserPhone});
//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, new String[]{"userName","userPhone"}, new int[]{android.R.id.text1,android.R.id.text2});
//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_2, new String[]{"userName","userPhone"}, new int[]{android.R.id.text1,android.R.id.text2});

String[] s = new String[2];
s[0] = "userName";
s[1] = "userPhone";
int[] i = new int[2];
i[0] = android.R.id.text1;
i[1] = android.R.id.text2;
SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, s, i);

userList.setAdapter(sim);

//列表項單擊事件
userList.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
System.out.println(arg2);
System.out.println(arg3);
}
});

//列表項選中事件
userList.setOnItemSelectedListener(new ListView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
System.out.println("selected----------" +arg2);
System.out.println("selected----------" +arg3);
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}
});

//列表項長按事件
userList.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {

@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
System.out.println("long---------" + arg2);
System.out.println("long---------" + arg3);
return true;
}
});
}
}

上邊注釋的三句話

第一句 是我們可以自定義布局文件展示數據

第二句 我們可以用內置的布局文件來展示

第三句 和第二句一樣,但是效果不一樣,大家運行看看就明白了

 GridView

類似與手機主菜單中展示的效果,如圖

網格視圖控件和我們的ListView 操作很像,上邊已經解釋過了,這裡直接貼代碼了

package TSD.Jason.Example;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
import android.widget.SimpleAdapter;

public class GridViewActivity extends Activity {

// 定義整型數組 即圖片源
private Integer[] mImageIds =
{
R.drawable.img1,
R.drawable.img2,
R.drawable.img3,
R.drawable.img4,
R.drawable.img5,
R.drawable.img6,
R.drawable.img7,
R.drawable.img8,
R.drawable.img1,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview);
GridView gridview = (GridView) findViewById(R.id.gridview);
// 生成動態數組,並且轉入數據
ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();

for (int i = 0; i < 9; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", mImageIds[i]);// 添加圖像資源的ID
map.put("ItemText", "NO." + String.valueOf(i));// 按序號做ItemText
lstImageItem.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, lstImageItem,
R.layout.gridviewitem,
new String[] { "ItemImage", "ItemText" }, new int[] {
R.id.ItemImage, R.id.ItemText });
gridview.setAdapter(simple);
}
}

好,今天就到這裡,源代碼

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved