android系統中ListView的用法稍微複雜一點,配置Adpater就有幾種方法,如ArrayAdapter,SimpleAdapter等。查了一些網上的相關例子,有很多都是用ListActivity,然後用Adapter來顯示布局。本例中沒有用到ListActivity

ListView是在android中是一個經常用到的控件,ListView裏面的每個子項Item可以使用一個字符串,也可以是一個組合控件,下面是本例將要實現的功能清單:

  1. 準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
  2. 構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
  3. 把 適配器 添加到ListView,并顯示出來;
  4. ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應Item的數據,通過getChildAt(0)找控件;
  5. 實現長按后彈出menu對話框效果;

本文所實現的ListView如下:

UI代碼如下:

代码 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>


< ListView android:id ="@+id/ListView01" android:layout_width ="wrap_content"
android:layout_height
="wrap_content" ></ ListView >
</ LinearLayout >

設置ListViewItem樣式 xml文件如下:

代码 < RelativeLayout android:id ="@+id/RelativeLayout01"
android:layout_width
="fill_parent" android:layout_height ="wrap_content"
android:paddingBottom
="4dip"
android:paddingLeft
="12dip"
android:paddingRight
="12dip"
xmlns:android
="http://schemas.android.com/apk/res/android" >

< CheckBox android:id ="@+id/CheckBox01"
android:layout_alignParentRight
="true"
android:paddingTop
="12dip"
android:layout_width
="wrap_content"
android:focusable
="false"
android:layout_height
="wrap_content" ></ CheckBox >

< TextView android:text ="TextView1" android:id ="@+id/topTextView"
android:layout_width
="fill_parent"
android:textSize
="20dip"
android:layout_height
="wrap_content" ></ TextView >


< TextView android:text ="TextView2" android:id ="@+id/bottomTextView"
android:layout_below
="@+id/topTextView" android:layout_width ="fill_parent"
android:layout_height
="wrap_content" ></ TextView >

</ RelativeLayout >

到這一步,順便解答上面第4個問題:如何設置在 ListView中調協CheckBox之后還可以執行單擊或長按事件,在Android中 CheckBox的點擊事件優先級比ListView高,當頁面一加載時,會默認聚焦在CheckBox上,為了防止這個問題出來,我們要在Android的控件上的屬性加上Bool值:android:focusable="false"

最后就是Java源代碼,之后我再一一解答上面的所有問題:

代码 package cn.terry;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget. * ;
import android.widget.AdapterView.OnItemClickListener;
public class testListViewAcitivity extends Activity{
private ListViewmyListView;
/** Calledwhentheactivityisfirstcreated. */
@Override
public void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView
= (ListView)findViewById(R.id.ListView01);

ArrayList
< HashMap < String,Object >> listitem = new ArrayList < HashMap < String,Object >> ();

for ( int i = 0 ;i < 10 ;i ++ )
{
HashMap
< String,Object > map = new HashMap < String,Object > ();
map.put(
" ItemTitle " , " 文章 " + i);
map.put(
" ItemText " , " Android小項目 " + i);
listitem.add(map);
}

SimpleAdapterlistitemAdapter
= new SimpleAdapter( this , // 上下文
listitem, // 數據
R.layout.listview_style, // listItem的xml實現
new String[]{ " ItemTitle " , " ItemText " }, // 從map的批定Key
new int []{R.id.topTextView,R.id.bottomTextView} // 到要實現的控件上
);

myListView.setAdapter(listitemAdapter);

myListView.setOnItemClickListener(
new OnItemClickListener(){

@Override
public void onItemClick(AdapterView <?> arg0,Viewarg1, int arg2,
long arg3){


// TODOAuto-generatedmethodstub
RelativeLayoutlr = (RelativeLayout)arg1;
TextViewmText
= (TextView)lr.getChildAt( 1 );
Toast.makeText(testListViewAcitivity.
this , " 你點擊了第 " + arg2 + " 項的 " + mText.getText().toString(),
1000 ).show();




}
});
myListView.setOnCreateContextMenuListener(
new OnCreateContextMenuListener(){

@Override
public void onCreateContextMenu(ContextMenumenu,Viewv,
ContextMenuInfomenuInfo){
// TODOAuto-generatedmethodstub

ListViewlr
= (ListView)v;
RelativeLayoutmyte
= (RelativeLayout)lr.getChildAt( 0 );
TextViewdd
= (TextView)myte.getChildAt( 1 );
menu.setHeaderIcon(R.drawable.icon);
menu.setHeaderTitle(dd.getText().toString());
menu.add(
1 , 0 , 0 , " 高亮 " );
menu.add(
0 , 1 , 0 , " 置頂 " );
}
});

}
@Override
public boolean onContextItemSelected(MenuItemitem){
// TODOAuto-generatedmethodstub
StringTemp = "" ;
switch (item.getItemId()){
case 0 :
Temp
= " 高亮 " ;
break ;
case 1 :
Temp
= " 置頂 " ;
break ;
default :
break ;
}
Toast.makeText(
this ,Temp + " 處理 " , 1000 ).show();
return super .onContextItemSelected(item);
}



}

問題:

  1. 準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
  2. 構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
  3. 把 適配器 添加到ListView,并顯示出來;
  4. ListViewItem添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應item的數據,通過getChildAt(0)找控件;
  5. 實現長按后彈出Menu對話框效果;

解答:

  1. ListView要顯示的數據,

    使用泛型可以方便我們對數據的取舍,使用HashMap,是為了得到keyvalue之后可以通過key去設置ListView各控件的值

    項卡中我們用到的代碼如下: 代码 ArrayList < HashMap < String,Object >> listitem = new ArrayList < HashMap < String,Object >> ();

    for ( int i = 0 ;i < 10 ;i ++ )
    {
    HashMap < String,Object > map = new HashMap < String,Object > ();
    map.put( " ItemTitle " , " 文章 " + i);
    map.put( " ItemText " , " Android小項目 " + i);
    listitem.add(map);
    }

  2. ListView支持多種適配器數據 如:SimpleAdapterArrayAdapter,本例使用的是SimpleAdapter,先看看simpleAdapter參數列表, android.widget.SimpleAdapter.SimpleAdapter(Contextcontext,List <? extends Map < String, ?>> data, int resource,String[]from, int []to)

    參數一:上下文,即可以理解為本類;
    參數二:支持的數據源,如我們上文定義好的ArrayList<HashMap<String,Object>>
    參數三:Itemxml實現,上邊我們建立了ListView的Item樣式XML,用法如:R.layout.listview_style
    參數四:字符數組,大致意思可以這樣理解,就是“從哪里來”,上文我們通過設置HashMap的鍵值,可以通過如下方式:new String[]{"ItemTitle","ItemText"},
    參數五:整形數組,大致意思引用參數四可以這樣理解,“從哪裡來,到哪里去”通過事先from的鍵值to某個控件如:new int[]{R.id.topTextView,R.id.bottomTextView},注意,這里參數五的控件綁定數組要與參數四一一對應;
    代碼如下: 代码 SimpleAdapterlistitemAdapter = new SimpleAdapter( this , // 上下文
    listitem, // 數據
    R.layout.listview_style, // listItem的xml實現
    new String[]{ " ItemTitle " , " ItemText " }, // 從map的批定Key
    new int []{R.id.topTextView,R.id.bottomTextView} // 到要實現的控件上
    );

  3. 己經為SimpleAdapter設置好數組了。現在就到了把SimpleAdapter送到ListView身上就可以,代碼如下: myListView.setAdapter(listitemAdapter);


    代碼簡單,不需要過多解釋;

  4. 單擊后如何找到對應的項呢?通過調試發現,ListView的單擊事件會自動定位到我們事先定義好的樣式xml文件,之后我們要做的就是通過setOnItemClickListener自帶的事件參數View把對應的控件找出來,之后我們可以做我們想做的事,通過getChildAt()的下標參數定位控件,然後轉換成需要的可用控件,再取值或賦值,代碼如下:

    代码
    myListView.setOnItemClickListener( new OnItemClickListener(){

    @Override
    public void onItemClick(AdapterView <?> arg0,Viewarg1, int arg2,
    long arg3){


    // TODOAuto-generatedmethodstub
    RelativeLayoutlr = (RelativeLayout)arg1;
    TextViewmText = (TextView)lr.getChildAt( 1 );
    Toast.makeText(testListViewAcitivity. this , " 你點擊了第 " + arg2 + " 項的 " + mText.getText().toString(),
    1000 ).show();




    }
    });

  5. 長按顯示對話框的事件為:setOnCreateContextMenuListener,事件參數為: 代码 void cn.terry.testListViewAcitivity.onCreate(...).新建OnCreateContextMenuListener(){...}.onCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo)

    指定:OnCreateContextMenuListener中的onCreateContextMenu(...)
    public abstract void onCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo)
    Since:APILevel 1
    Calledwhenthecontextmenu for this viewisbeingbuilt.Itisnotsafetoholdontothemenuafter this methodreturns.

    Parameters
    menuThecontextmenuthatisbeingbuilt
    vTheview for whichthecontextmenuisbeingbuilt
    menuInfoExtrainformationabouttheitem for whichthecontextmenushouldbeshown.Thisinformationwillvarydependingonthe class ofv.

    我們要做的只要在menu使用menu去創建事件選擇按鈕即可,代碼如下: menu.setHeaderIcon(R.drawable.icon);
    menu.setHeaderTitle(dd.getText().toString());
    menu.add( 1 , 0 , 0 , " 高亮 " );
    menu.add( 0 , 1 , 0 , " 置頂 " );

    還需要重寫

    boolean cn.terry.testListViewAcitivity.onContextItemSelected(MenuItemitem)

    這個事件,此事件為執行menu按鍵的事件傳遞,通過Item.getItemId()()方法得到用戶點擊的某個按鈕,然後執行命令,參考代碼如下:
代码 public boolean onContextItemSelected(MenuItemitem){
// TODOAuto-generatedmethodstub
StringTemp = "" ;
switch (item.getItemId()){
case 0 :
Temp = " 高亮 " ;
break ;
case 1 :
Temp = " 置頂 " ;
break ;
default :
break ;
}
Toast.makeText( this ,Temp + " 處理 " , 1000 ).show();
return super .onContextItemSelected(item);
}

總結:

到此ListView的基本操作己經完成,但還存在問題:

  • ListView上實現圖片的動態切換不是很理想;
  • ListView上實現長按效果時,想得到其中某一項的Item值無從下手,難道要重寫View?
  • 使用ArrayList<HashMap<String, Object>> listitem必需New,切記!;

更多相关文章

  1. android:layout_gravity="right"控制LinearLayout中控件居右显示
  2. Android的反编译和代码混淆
  3. 在Android上实现HttpServer的示例代码
  4. Android WebView 调用React Js 代码
  5. Android Touch事件分发响应机制
  6. android recover 系统代码分析 -- 选择进入
  7. android源代码的利用
  8. 5、控件系列之TOAST(吐司提示)的曾经、现在与未来
  9. Android Studio App设置线性布局LinerLayout控件垂直/水平方向排

随机推荐

  1. Android蓝牙简单开发
  2. 全屏闪烁问题
  3. Android Studio安装与环境搭建
  4. Android HttpURLConnection上传图片至Ser
  5. Android 报Error inflating class ...错
  6. android恶意程序分析 (三)
  7. android TextView setTextColor
  8. Glide 加载圆形头像和gif 图
  9. Android NFC Demo如何模拟Tag?
  10. android 优秀框架整理