安卓017ListView & GridView & ScrollView

來源:互聯網
上載者:User

標籤:

ListView 在APP開發中幾乎無處不在,重要性,不言而喻!


XML 代碼:
<ListView android:id="@+id/mylistView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/ctype">
</ListView>


常用屬性:
android:divider 用於為列表執行個體設定分隔條,可以用顏色分隔,也可以用Drawable資源分隔
android:dividerHeight  用於設定分隔條的高度
android:entries 列表的資料來源
android:footerDividerEnabled  用於設定是否在 footer View 之前繪製分隔條,預設值為
true,設定為 false 時,表示不會繪製,使用該屬性時,需要通過 LiswView 組件提供的
addFooterView()方法為 ListView 設定 footer View
android:headerDividersEnabled  用於設定是否在 header View 之後繪製分隔條, 預設
值為 true,設定為 false 時,表示不會繪製,使用該屬性時需要通過 LiswView 組件提供的
addHeaderView()方法為 ListView 設定 header View



ListView  與(Array/Simple)Adapter  的使用

1.ArrayAdapter :
資料來源為數組或集合
構造器:new ArrayAdapter(this,xml,資料來源);
String [] ctype={};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item1, ctype);
ArrayAdapter<CharSequence>
adapter2=ArrayAdapter.createFromResource(this, R.array.ctype,
android.R.layout.simple_list_item1);


2.SimpleAdapter:
資料來源為 List<Map<String,?>>
構 造 器 : new  SimpleAdapter(this, 數 據 源 ,xml,new  String[]{key1,key2},new
int[]{R.id.image,R.id.textview});
說明:

①key 為資料來源 Map 的鍵
②String[]和 int[]必須一一對應
android.R.layout.simple_list_item_multiple_choice:每個清單項目都帶多選框文本
android.R.layout.simple_list_item_1 每個清單項目都是一個普通的文本
android.R.layout.simple_list_item_2 每個清單項目都是一個普通的文本(字型略大)
android.R.layout.simple_list_item_checked 每個清單項目都有一個已勾選的清單項目
android.R.layout.simple_list_item_single_choice 每個清單項目都是帶選項按鈕的文本
常用的監聽方法
listView.setOnItemClickListener(new OnItemClickListener()
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View  view, int position,long id) {
String res = parent.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show();
}
});



Adapter 和 和 AdapterView  區別
Adapter:根據給定的資料來源分配一個布局
AdapterView:為 Adapter 提供一個 View(ListView,GridView,Spinner)
說明
去掉 ListView 捲軸的方法
lv.setVerticalScrollBarEnabled(false);
去掉 ListView 分割線的方法
lv.setDivider(null);


ListView  的最佳化思路: 

系統顯示列表(ListView)時,首先會執行個體化一個適配器,本文將執行個體化一個自訂
的適配器。實現自訂配接器,必須手動映射資料,這時就需要重寫 getView()方法,系統在繪製列表的每
一行的時候將調用此方法。
ListView 在開始繪製的時候,系統自動調用 getCount()函數,根據函數返回值得到 ListView的長度,
然後根據這個長度,調用 getView()逐一畫出每一行。


具體使用方法可以參考下面代碼,只需記住
 Android 自訂 ListView 三步驟:第一步:準備主布局檔案、組件布局檔案等使用 LayoutInfiter 動態載入
第二步:擷取並整理資料
第三部:綁定資料,這裡我們是通過自己編寫 Adapter 類來完成的
1.建立一個類,繼承 BaseAdapter2.重寫方法

@Override
public int getCount() {
// 返回資料來源的大小
return getList().size();
}
@Override
public Object getItem(int position) {
// 根據 position 返回一個 item 對象
return getList().get(position);
}
@Override
public long getItemId(int position) {
//根據 position 返回行數
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//浪費資源的錯誤寫法
// LayoutInflater inflater = getLayoutInflater();
// View view = inflater.inflate(R.layout.items, null);
// TextView tv = (TextView) view.findViewById(R.id.textView1);
// tv.setText(getList().get(position));
// System.out.println("position-->" + position);
//正確寫法
View view = null;
if(convertView == null){
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.items, null);
}else{
//如果 convertView 不為空白,說明該 view 之前載入進來過,所以直接將其賦給 view,即反覆
使用,避免再建立新的 view 浪費資源
view = convertView;
}
TextView tv = (TextView) view.findViewById(R.id.textView1);
tv.setText(getList().get(position));
System.out.println("position-->" + position);
return view;
}


ListView 之 之 AsyncTask  載入網路資料-XML&json1、城市列表 json 的介面:
http://127.0.0.1/DataServer/CityServlet?type=json
2、城市列表 xml 的介面:
http://127.0.0.1/DataServer/CityServlet?type=xml


【擴充】ListActivity


一、定義:一個包含 ListView 的 Activity
二、使用:
1.不需要定義 xml 布局檔案
2.在 Activity 的 onCreate()方法中,不需要 setContentView()方法
3.使用方式與 ListView 方式類似,注意設定 Adapter 時,使用的是 setListAdapter 方法
比如:setListAdapter(adapter);
4.添加點擊事件
①設定監聽器
getListView.setOnItemClickListener()...
②使用回調方法
onListItemClick()
public class MainActivity extends ListActivity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 建立用於 ListView 指定清單項目的適配器
String[] ctype = new String[] { "情景模式", "主題模式", "手機", "程式
管理" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, andro
id.R.layout.simple_list_item_1, ctype);
setListAdapter(adapter);
}
}


【擴充】ExpandableListView


功能:是一個二級列表,分為 group 和 child,group 表示一級列表,child 表示二級列表
和 ListView 不同的是它是一個兩級的滾動列表視圖,每一個組可以展開,顯示一些子項,
這些項目來至於ExpandableListAdapter的子類,也就是說,要實現向裡面添加項目,必須寫一個
子類實現 ExpandableListAdapter 的介面或者使用系統為我們實現在子類
BaseExpandableListAdapter,
SimpleExpandableListAdapter
適配器
// 資料
private List<String> groupData;// 定義組資料
private List<List<String>> childrenData;// 定義組中的子資料
// 上下文
private Context context;
// 布局檔案載入器
private LayoutInflater inflater;
/**
* 構造器
*
* @param groupData
* @param childrenData
* @param context
*/
public MyExpandableListAdapter(List<String> groupData, List<List<Strin
g>> childrenData, Context context) {
super();
this.groupData = groupData;
this.childrenData = childrenData;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
/**
* 得到組的數量
*/
@Override
publicint getGroupCount() {
returngroupData != null ? groupData.size() : 0;
}
/**
* 得到哪一組下面的子類個數
*/
@Override
public int getChildrenCount(intgroupPosition) {
returnchildrenData.get(groupPosition) != null ? childrenData.get(gr
oupPosition).size() : 0;
}
/**
* 得到組
*/
@Override
public Object getGroup(intgroupPosition) {
returnthis.groupData.get(groupPosition);
}
/**
* 得到組下面的子項
*/
@Override
public Object getChild(intgroupPosition, intchildPosition) {
returnthis.childrenData.get(groupPosition).get(childPosition);
}
/**
* 得到組位置
*/
@Override
publiclong getGroupId(intgroupPosition) {
returngroupPosition;
}
/**
* 組下面的子項位置
*/
@Override
publiclong getChildId(intgroupPosition, intchildPosition) {
returnchildPosition;
}
@Override
publicboolean hasStableIds() {
returnfalse;
}
@Override
public View getGroupView(intgroupPosition, booleanisExpanded, View conv
ertView, ViewGroup parent) {
TextView tv = null;
if (convertView == null) {
tv = (TextView) inflater.inflate(android.R.layout.simple_list_i
tem_1,null);
convertView = tv;
} else {
tv = (TextView) convertView;
}
// 設定資料
tv.setText(" "+groupData.get(groupPosition));
returntv;
}
@Override
publicView getChildView(intgroupPosition, intchildPosition, booleanisLa
stChild, View convertView,
ViewGroup parent) {
TextView tv = null;
if (convertView == null) {
tv = (TextView) inflater.inflate(android.R.layout.simple_list_i
tem_1,null);
convertView = tv;
} else {
tv = (TextView) convertView;
}
// 設定資料
tv.setText(" "+childrenData.get(groupPosition).get(childPosit
ion));
return tv;
}
/**
* //child 是否可以被點擊,true 可以點,false 不可以點
*/
@Override
publicboolean isChildSelectable(intgroupPosition, intchildPosition) {
return true;
}
監聽器
OnChildClickListener:單擊 child 會觸發該監聽器
exListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(getApplicationContext()
, child.get(groupPosition).get(childPosition) + "", Toast.LENGTH_SHORT).show();
return false;
}
});


ListView  分頁在使用的時候,將伺服器端所有的資料下載並顯示出來是不適宜的,我們需要將伺服器端的
資料進行分頁顯示,當使用者下拉到底部時,更新下一頁內容
1. 伺服器端:
將資料進行分頁,通過頁碼區分資料,比如
第一頁
第二頁
2. 用戶端
(1)思路:用戶端首先需要載入第一頁內容,當使用者下拉到 ListView 底部時更新下一頁內容,
並顯示
(2)步驟:
①首先通過非同步任務下載第一頁內容,並更新到 ListView
②判斷使用者下拉到 ListView 底部,需要使用 onScrollListener
③下拉到最底部後要顯示載入的進度條,資料載入完畢要隱藏
lv.setOnScrollListener(new OnScrollListener() {
/**
* 返回使用者滑動手機螢幕的狀態,具體分為三種 SCROLL_STATE_IDLE:0,使用者停止滑動,即鬆手
* SCROLL_STATE_TOUCH_SCROLL:1,使用者正在滑動,手指一直觸控螢幕幕
* SCROLL_STATE_FLING:2,使用者正在滑動並且伴隨慣性移動
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
System.out.println(“------“ + scrollState);
if (isBottom && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
Toast.makeText(getApplicationContext(), “正在下載資料。。。”, Toast.LENGTH_SHORT).show();
foodView.setVisibility(View.VISIBLE);
new MyAsyncTask().execute();
}
}
/**
* firstVisibleItem:返回曾經已見但現在移出螢幕的項的索引
* visibleItemCount:顯示當前螢幕所顯示的項的索引 totalItemCount:返回所有項的總數
* 注意:當firstVisibleItem + visibleItemCount
* =totalItemCount時,說明已滑動到螢幕底部
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);
}});

ListView+CheckBox一、引入:在 android 系統的點擊事件中,ListView 中 Item 的點擊事件的優先順序要高於
CheckBox 的點擊事件,當在布局檔案中加入 CheckBox 後 onItemClickListener 會失效
二、解決辦法:
1 ,使用 CheckBox  裡讓其不能獲得焦點
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false" -------here
android:focusable="false"-------here
android:focusableInTouchMode="false"/>
2 ,定義一個集合去存放哪些選中了,哪些沒選中
// 用來控制 CheckBox 的選中狀況
private HashMap<Integer, Boolean> isSelected;


Bitmap 和 和 BitmapFactory  的簡易使用一、Bitmap 類
Bitmap 類代表位元影像,它是 Android 系統中影像處理的最重要類之一,使用它不僅可以
擷取影像檔資訊,進行映像剪下,旋轉,縮放等操作,而且還可以指定格式儲存影像檔。
Bitmap 類常用的方法
二、BitmapFactory 類
該類為一個工具類,用於從不同的資料來源來解析,建立 BitMap 對象。
常用方法如下:
方法 描述
decodeFile(String pathName)  用於從給定的路徑所指定的檔案中解析、創
建 Bitmap 對象
decodeResource(Resources res, int id)  用於根據給定的資源 ID 從指定的資源中解
析、建立 Bitmap 對象
decodeStream(InputStream is)  用於從指定的輸入資料流中解析、建立 Bitmap
對象
三、如何從 SD 記憶卡中解析圖片文檔String path=”/sdcard/picture/bccd/img01.jpg”
Bitmap bm=BitmapFactory.decodeFile(path);
從資源檔中解析圖片
Bitmap bm=BitmapFacotry.decodeResource(MainActivity.this.getResources(),R.drawable.img02);
 非同步載入圖片及文字的 ListView實際開發中,針對 ListView 會顯示有圖片,標題,時間等,比如網易新聞用戶端
步驟
1,建立自訂的布局檔案
2,請求網路 JSON
3,載入資料
4 ,對於每一條資料再啟動一個線程去下載圖片


GridView  的使用1.定義:顯示二維,網格狀的 view 和 ListView 屬於同一層級,繼承子 AbsListView
XML  文法
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchMode="columnWidth"
android:numColumns="4">
</GridView>
常用屬性
①android:columnWidth : 列寬
②android:gravity : 對齊,一般為 center
③android:horizontalSpacing : 水平空白,列之間的間距
④android:verticalSpacing : 垂直空白,行之間的間距
⑤android:numColumns : 列數,auto_fit:自適應,即根據螢幕的寬度決定列數
⑥android:stretchMode : 伸展模式,屬性如下:
STRETCH_COLUMN_WIDTH:根據列寬伸展,與 gravity 配合使用,可使 view 置中
STRETCH_SPACING:根據空白伸展,與 gravity 配合使用,可使 view 靠左對齊
STRETCH_SPACING_UNIFORM:均勻空白伸展,與 gravity 配合使用,可使 view 靠右對齊
資料載入要使用適配器
1,ArrayAdapter
2,SimpleAdapter
3,自訂 Adapter
常用事件
OnItemClickListener
綜上,其實 GridView 和 和 ListView  除了顯示方式不一樣,其它的都一樣


ScrollView滾動視圖用於為其它組件添加捲軸,在預設的情況下,當表單中內容比較多,而一屏
顯示不下時,超出的部分不能被使用者所看到.因為 Android 的布局管理器本身沒有提供滾動屏
幕的功能.如果要讓其滾動,就要使用滾動視圖 ScrllView.
滾動視圖是 FrameLayout 的子類,因此,在滾動視圖中,可以添加任何想要放入其中的組件,但
是一個滾動視圖中只能放一個組件,如果要放置多個,可以先放一個存布局管理器.再將要放
置的組件放置到該布局管理器中, 在滾動視圖中, 使用比較多的是線性布局管理器.
XML 文法:
<ScrollView
android:id="@+id/myscollView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
放置組件, 只能放一個哦
</ScrollView>
常用屬性
android:scrollbars 設定捲軸顯示。none(隱藏),horizontal(水平),vertical(垂直)。
android:scrollbarFadeDuration 設定捲軸淡出效果(從有到慢慢的變淡直至消失)時間,
以毫秒為單位。Android2.2 中捲軸滾動完之後會消失,再滾動又會出來,在 1.5、1.6 版本
裡面會一直顯示著。
android:scrollbarSize 設定捲軸的寬度。
android:scrollbarStyle 設定捲軸的風格和位置。設定值:insideOverlay、insideInset、
outsideOverlay、outsideInset
android:scrollbarThumbHorizontal 設定水平捲軸的 drawable。
android:scrollbarThumbVertical 設定垂直捲軸的 drawable
android:scrollbarTrackHorizontal 設定水平捲軸背景(軌跡)的色 drawable
android:soundEffectsEnabled 設定點擊或觸摸時是否有聲音效果


HorizontalScrollView水平滾動視圖 HorizontalScrollView 如網易新聞的標題
XML  文法
<HorizontalScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"/>
</HorizontalScrollView>











安卓017ListView & GridView & ScrollView

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.