欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Android學習筆記(十八):ListView和RatingBar

系統 2960 0

學習筆記(十七) 中,我們對ListView做了進一步的探討,然而給出的例子list中的元素可以有多個widget,并可靈活設置他們的值,但是這些widget之間缺乏互動,而且getView()的調用,需要重刷給list的entry,我們希望能夠在entry中觸發變化。

本次,我們繼續根據《Beginging Android 2》的學習,結合RatingBar,將程序稍微復雜一點。RatingBar看用于媒體庫的平級,我們用RatingBar取代了之前例子的圖標,當RatingBar設置為三星時,該entry后面的文本改為大寫,如果低于三星將恢復原來的小寫顯示。

例子:自定義數據結構和內部widget的觸發處理

1)Android XML文件: 用RatingBar替代之前例子的ImageView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ……>
< RatingBar android:id="@+id/c85_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android: numStars = "3" <!-- 設置三星平級方式-->
android: stepSize = "0.5" <!--step為0.5,也就是允許2.5的星級評比 -->
android: rating = "2"/> <!-- 缺省為2星-->
<TextView android:id="@+id/c85_label"
android:paddingLeft="2px"
android:paddingRight="2px"
android:paddingTop="10px"
android:textSize="24sp"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>

2)設置自定制數據結構來存儲信息,并提供查詢信息的方法

在之前的例子中,我們使用了ArrayList<String>來存放每個單元的數據信息,在這個例子中,作為更通用的方式,每個單元信息為我們自定的類RowModel。

class RowModel{
String label; //存儲entry的當前文本顯示內容,通過調用toString()給出,如果三星將提供大寫顯示。
float rating = 2.0f; //存儲entry的星級數據,對應RatingBar的星級顯示

RowModel(String label){
this.label = label;
}
public String toString(){
if(rating >= 3.0){
return label.toUpperCase();
}
return label;
}
}

在我們的主類中,根據自定義的數據結構設置我們的數據信息list,并導入list adapter中,同時我們增加一個方法,根據position(index)來從數據信息中獲取該單元的數據。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<RowModel> list = new ArrayList<RowModel>(); //步驟1:list作為數據的存儲
for(String s: items){ //步驟2:將String[] items的信息導入list中,這種寫法比較特別,我一般會老老實實for(int i =0; i <items.length; i++)的方式來寫。
list.add(new RowModel(s));
}
setListAdapter(new RatingAdapter(list)); //步驟3:設置自定制的listadapter(具體在后面處理),并將信息數據list導入其中
}
//根據List的位置,獲得具體的list元素,一般add,del,find的處理中,相當于find
private RowModel getModel(int position){
return ((RatingAdapter)getListAdapter()).getItem(position);
}

3)List單元的View和widget信息捆綁,實現快速定位widget

根據之前的學習,為了使程序運行得更有效率,我們會使用setTag的方式,將list單元的UI的View和存儲單元UI中widget信息的類捆綁,以便可以快速定位widget。

步驟1:設置存儲List單元View中widget的相關類。

其實,我們可以將這些widget信息和2)中的數據信息放在一起,在這個例子中程序會更借鑒,但是這樣的處理很不好,我們盡可能把要將UI相關的信息和數據信息放在一起,否則UI修改或者進行尺寸適配時出現麻煩。

private class ViewWrapper{
View base;
RatingBar rate = null;
TextView label = null;

ViewWrapper(View base){
this.base = base;
}

RatingBar getRatingBar(){
if(rate == null)
rate =(RatingBar) base.findViewById(R.id.c85_rating);
return rate;
}

TextView getLabel(){
if(label == null)
label = (TextView)base.findViewById(R.id.c85_label);
return label;
}
}

步驟2:List單元View的呈現(getView),并且提供其中widget觸發的處理

一個List單元的View對應兩個內容,一個是存儲的數據,可以通過getModel來獲得,另一個是對應的單元UI的widget隊形的存儲,通過getTag()和setTag(),這個在上一次學習中已經學習了,我們還需要增加View中widget的觸發,在這個例子中,當RatingBar的星級出現變化是,可能需要重寫刷新后面文章的顯示。我們具體看代碼:

private class RatingAdapter extends ArrayAdapter<RowModel>{
//步驟2.1:設置構造函數,將數據信息放入ArrayAdapter中,這樣可以通過getItem() 獲取數據信息,同時也設置layout格式
RatingAdapter(ArrayList<RowModel> list){
super(Chapter8Test5.this,R.layout.entry,list);
}

//步驟2.2: 編寫ListView中每個單元的呈現
public View getView (int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewWrapper wrapper;
RatingBar ratebar = null;

//步驟2.3:如果沒有創建View,根據layout創建之,并將widget的存儲類的對象與之捆綁為tag
if(row == null){
LayoutInflater inflater=getLayoutInflater();
row = inflater.inflate(R.layout.entry, parent,false);
wrapper = new ViewWrapper(row);
row.setTag(wrapper);
//步驟2.4:在生成View的時候,添加將widget的觸發處理
ratebar = wrapper.getRatingBar();
ratebar. setOnRatingBarChangeListener (new RatingBar. OnRatingBarChangeListener () {
public void onRatingChanged (RatingBar ratingBar, float rating, boolean fromUser) {
//步驟2.4.1:存儲變化的數據
Integer index = (Integer)ratingBar.getTag();
RowModel model = getModel(index);
model.rating = rating;
//步驟2.4.2:設置變化
LinearLayout parent = (LinearLayout)ratingBar.getParent();
TextView label = (TextView)parent.findViewById(R.id.c85_label);
label.setText(model.toString());
}
});
}else{ //步驟2.4:利用已有的View,獲得相應的widget
wrapper = (ViewWrapper) row.getTag();
ratebar = wrapper.getRatingBar();
}
//步驟2.5:設置顯示的內容,同時設置ratingbar捆綁tag為list的位置,因為setTag()是View的方法,因此我們不能降至加在ViewWrapper,所以需要加載ViewWrapper中的widget中,這里選擇了ratebar進行捆綁。
RowModel model= getModel(position);
wrapper.getLabel().setText(model.toString());
ratebar. setTag (new Integer(position));
ratebar.setRating(model.rating);
return row;
}
}

我們在這里例子中進行了一個實驗,考察什么時候convertView可以為null,一屏可以顯示0-8個row,這些list的元素都是null,需要通過程序來創建,然而當我混動屏幕的時候,我想象中,后面的元素第一次也應該為0,但是出乎我的意外,只有position=14的出現row=null。 對于通過scroll屏幕的情況,下一屏Android可能根據第一屏對UI的處理情況進行了處理。 因此 Android對UI的智能處理情況我們不太能把握,因此任何與數據有關,不是純粹的UI問題的初始賦值的問題,不要只放置在if(row==null)中進行初始處理,否則會引起不可預測的意外 。例如我們將步驟2.5中的ratebar.setTag(new Integer(position))此句放在if(row==null)會得到不正常的結果,因為不是所有的list元素中的該widget都在初始的情況下成功進行了捆綁,所以我們將它放置在外面或者通知方式在if和else的判斷中,保證所有情況都覆蓋。

ListAdapter:CursorAdapter

一般來講,我們可以使用ArrayAdapter來適用很多情況,還有其他的Adapter,使用方式類似,但是CursorAdapter有些不一樣,通過newView()和bindView(),如果沒有創建,使用newView(),然后調用bindView(),如果已經創建,使用bindView()。

相關鏈接: 我的Andriod開發相關文章

Android學習筆記(十八):ListView和RatingBar


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月天黄色网址 | 久操导航| 日韩观看 | 国产亚洲欧美在线人成aaaa | 久久草在线视频 | 日本高清无卡码一区二区久久 | 日韩欧美视频一区二区在线观看 | 亚州第一视频 | 中文字幕一区在线观看视频 | 亚洲人成免费网站 | 欧美a级毛毛片免费视频试播 | 欧美不卡 | 久久久久久成人精品 | 国产成人精品免费视频大 | 国产一区二区小早川怜子 | 精品久久久久久久久久久久久久 | 中国大陆高清aⅴ毛片 | 日韩一区二区免费视频 | 久久精品一区二区三区四区 | 99青青青精品视频在线 | 欧美日韩综合在线视频免费看 | 日韩精品免费视频 | 欧美狠狠操 | 亚洲天堂午夜 | 精品视频在线免费看 | 成人性a激情免费视频 | 欧美日本一道本 | 丁香成人影院 | 精品免费国产一区二区三区四区 | 国产日产亚洲欧美综合另类 | 在线观看网 | 高清国产一区二区三区四区五区 | 成年网站视频在线观看 | 精品亚洲永久免费精品 | 天堂资源地址在线 | 日本在线观看免费视频 | 日韩男人的天堂 | 国产a视频 | 精品一区二区三区在线视频 | 91精品久久久久久久久久久 | 黄色片免费在线 |