亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android學(xué)習(xí)筆記(十八):ListView和RatingBar

系統(tǒng) 2903 0

學(xué)習(xí)筆記(十七) 中,我們對(duì)ListView做了進(jìn)一步的探討,然而給出的例子list中的元素可以有多個(gè)widget,并可靈活設(shè)置他們的值,但是這些widget之間缺乏互動(dòng),而且getView()的調(diào)用,需要重刷給list的entry,我們希望能夠在entry中觸發(fā)變化。

本次,我們繼續(xù)根據(jù)《Beginging Android 2》的學(xué)習(xí),結(jié)合RatingBar,將程序稍微復(fù)雜一點(diǎn)。RatingBar看用于媒體庫(kù)的平級(jí),我們用RatingBar取代了之前例子的圖標(biāo),當(dāng)RatingBar設(shè)置為三星時(shí),該entry后面的文本改為大寫(xiě),如果低于三星將恢復(fù)原來(lái)的小寫(xiě)顯示。

例子:自定義數(shù)據(jù)結(jié)構(gòu)和內(nèi)部widget的觸發(fā)處理

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" <!-- 設(shè)置三星平級(jí)方式-->
android: stepSize = "0.5" <!--step為0.5,也就是允許2.5的星級(jí)評(píng)比 -->
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)設(shè)置自定制數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)信息,并提供查詢信息的方法

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

class RowModel{
String label; //存儲(chǔ)entry的當(dāng)前文本顯示內(nèi)容,通過(guò)調(diào)用toString()給出,如果三星將提供大寫(xiě)顯示。
float rating = 2.0f; //存儲(chǔ)entry的星級(jí)數(shù)據(jù),對(duì)應(yīng)RatingBar的星級(jí)顯示

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

在我們的主類中,根據(jù)自定義的數(shù)據(jù)結(jié)構(gòu)設(shè)置我們的數(shù)據(jù)信息list,并導(dǎo)入list adapter中,同時(shí)我們?cè)黾右粋€(gè)方法,根據(jù)position(index)來(lái)從數(shù)據(jù)信息中獲取該單元的數(shù)據(jù)。

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

3)List單元的View和widget信息捆綁,實(shí)現(xiàn)快速定位widget

根據(jù)之前的學(xué)習(xí),為了使程序運(yùn)行得更有效率,我們會(huì)使用setTag的方式,將list單元的UI的View和存儲(chǔ)單元UI中widget信息的類捆綁,以便可以快速定位widget。

步驟1:設(shè)置存儲(chǔ)List單元View中widget的相關(guān)類。

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

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的呈現(xiàn)(getView),并且提供其中widget觸發(fā)的處理

一個(gè)List單元的View對(duì)應(yīng)兩個(gè)內(nèi)容,一個(gè)是存儲(chǔ)的數(shù)據(jù),可以通過(guò)getModel來(lái)獲得,另一個(gè)是對(duì)應(yīng)的單元UI的widget隊(duì)形的存儲(chǔ),通過(guò)getTag()和setTag(),這個(gè)在上一次學(xué)習(xí)中已經(jīng)學(xué)習(xí)了,我們還需要增加View中widget的觸發(fā),在這個(gè)例子中,當(dāng)RatingBar的星級(jí)出現(xiàn)變化是,可能需要重寫(xiě)刷新后面文章的顯示。我們具體看代碼:

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

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

//步驟2.3:如果沒(méi)有創(chuàng)建View,根據(jù)layout創(chuàng)建之,并將widget的存儲(chǔ)類的對(duì)象與之捆綁為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的時(shí)候,添加將widget的觸發(fā)處理
ratebar = wrapper.getRatingBar();
ratebar. setOnRatingBarChangeListener (new RatingBar. OnRatingBarChangeListener () {
public void onRatingChanged (RatingBar ratingBar, float rating, boolean fromUser) {
//步驟2.4.1:存儲(chǔ)變化的數(shù)據(jù)
Integer index = (Integer)ratingBar.getTag();
RowModel model = getModel(index);
model.rating = rating;
//步驟2.4.2:設(shè)置變化
LinearLayout parent = (LinearLayout)ratingBar.getParent();
TextView label = (TextView)parent.findViewById(R.id.c85_label);
label.setText(model.toString());
}
});
}else{ //步驟2.4:利用已有的View,獲得相應(yīng)的widget
wrapper = (ViewWrapper) row.getTag();
ratebar = wrapper.getRatingBar();
}
//步驟2.5:設(shè)置顯示的內(nèi)容,同時(shí)設(shè)置ratingbar捆綁tag為list的位置,因?yàn)閟etTag()是View的方法,因此我們不能降至加在ViewWrapper,所以需要加載ViewWrapper中的widget中,這里選擇了ratebar進(jìn)行捆綁。
RowModel model= getModel(position);
wrapper.getLabel().setText(model.toString());
ratebar. setTag (new Integer(position));
ratebar.setRating(model.rating);
return row;
}
}

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

ListAdapter:CursorAdapter

一般來(lái)講,我們可以使用ArrayAdapter來(lái)適用很多情況,還有其他的Adapter,使用方式類似,但是CursorAdapter有些不一樣,通過(guò)newView()和bindView(),如果沒(méi)有創(chuàng)建,使用newView(),然后調(diào)用bindView(),如果已經(jīng)創(chuàng)建,使用bindView()。

相關(guān)鏈接: 我的Andriod開(kāi)發(fā)相關(guān)文章

Android學(xué)習(xí)筆記(十八):ListView和RatingBar


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美久久久久久久久 | 久草在线免费播放 | 按摩理论片 | 国产成人免费在线观看 | 欧美成人看片一区二区三区 | 天天操天天干天天透 | 国产在线视频色综合 | 亚洲欧美日产综合一区二区三区 | 国产中文字幕视频 | 狠狠亚洲婷婷综合色香 | 最新毛片久热97免费精品视频 | 在线观看免费黄色小视频 | 2020国产成人免费视频 | 久草免费在线观看 | 一级女人毛片 | 这里只有精品久久 | 中文一级黄色片 | 正在播放一区二区 | 国产精品三 | 国产91页 | 日本一线一区二区三区免费视频 | 国产精品毛片一区 | 婷婷激情五月综合 | 欧美成人伊人十综合色 | 在线午夜 | 国产激情一区二区三区在线观看 | 五月婷婷免费视频 | 日本大片久久久高清免费看 | 免费观看一级特黄三大片视频 | 性网站免费 | 日韩欧美中文字幕在线视频 | 婷婷狠狠 | 伊人伊狠亚洲综合影院 | 亚洲色视频在线播放网站 | 日本色午夜 | 午夜精品久久久久久99热 | 手机看片福利永久国产日韩 | 高清中文字幕视频在线播 | 国产在线欧美日韩一区二区 | 国产成人刺激视频在线观看 | 日本一级黄色毛片 |