首先呢,我們還是看幾個示圖:
這種帶有圓角的listview' 看起來很棒吧,確實是這樣,其實也不能這么說,主要方形太多了,斯通見慣就不值錢了,“物以稀為貴嘛”. 就好比學java都搞androd,很明顯嘛,為了多賺點錢,可是供過於求的話,就不這么樂觀了,就好比現在這個圓角,如果太多太多的話,我想若干時間 段,肯定會被新的視圖所代替.所以“跟隨潮流,放寬眼線”很重要.不扯了,(網上實現例子很多)下面簡單介紹下實現方法:(兩種方法)
第一種:我們通過配置文件也就是shape自己實現圓角的背景,以及selector選中某項的背景.
首先我們要實現一個完整的圓角背景,用於默認與listview的background.
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <stroke android:width="1dp" android:color="@color/gray" /> <solid android:color="@color/white" /> <corners android:radius="8dp" /> </shape>
接下來我們要實現也就是listview的第一項selector后背景的shape.
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <stroke android:width="1dp" android:color="@color/gray" /> <solid android:color="@color/gray" /> <corners android:topLeftRadius="8dp" android:topRightRadius="8dp" /> </shape>
下面呢,我們也要實現中間的shape,以及末尾的shape等等配置.這里就不寫了.按照上面模仿就ok了.
第二種方法:我們用.9.png完全代替上面那些配置,(因為.9.png可以拉伸不毀容)
所以listview的第一項,中間項,最后一項,以及就一項,我們都可以通過圖片來實現.
這里我運用第一種方法:(也鞏固下shape)
創建自定義的listview,用於實現setSelector及選中的效果.
代碼片段:
package com.jj.listview; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.AdapterView; import android.widget.ListView; /*** * 自定義listview * * @author Administrator * */ public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } /**** * 攔截觸摸事件 */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: int x = (int) ev.getX(); int y = (int) ev.getY(); int itemnum = pointToPosition(x, y); if (itemnum == AdapterView.INVALID_POSITION) break; else { if (itemnum == 0) { if (itemnum == (getAdapter().getCount() - 1)) { // 只有一項 setSelector(R.drawable.list_round); } else { // 第一項 setSelector(R.drawable.list_top_round); } } else if (itemnum == (getAdapter().getCount() - 1)) // 最后一項 setSelector(R.drawable.list_bottom_round); else { // 中間項 setSelector(R.drawable.list_center_round); } } break; case MotionEvent.ACTION_UP: break; } return super.onInterceptTouchEvent(ev); } }
這段代碼網上很多,幾乎全部都是這么實現的,這里我簡單介紹,如果說錯了,請大家指出,
首先我們是實現了onInterceptTouchEvent這個方法,在這里我們也可以用onTouchEvent事件,都可以實現我們想要的效果.
onInterceptTouchEvent和onTouchEvent的區別:簡單的來說前者可以攔截后者.
詳細的請大家參考http://blog.csdn.net/ddna/article/details/5473293 強烈建議大家看看.
下面一些邏輯雖說沒有見過,我想大家都看得懂,(就是獲取坐標(x,y),然后根據坐標獲取listview相應的position值,沒有返回-1,然后根據相應的position設置相應的setSelector ).有時間得好好研究下listview.對靈活運用很有幫助.
在這里我還要在說名一點,上面那個圖形很顯然不是一個listview,是三個 listview,另外重要的是我們一個屏幕顯示不完全,這時我們就用到了ScrollView,一提到這個我想大家都知道ScrollView和 listview是冤家,不可能同時存在,不過網上有解決辦法,原理就是我們動態show 我們的listview,
實現方法:
*** * 動態設置listview的高度 * * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // params.height += 5;// if without this statement,the listview will be // a // little short // listView.getDividerHeight()獲取子項間分隔符占用的高度 // params.height最后得到整個ListView完整顯示需要的高度 listView.setLayoutParams(params); }
我們在Listview的setAdapter后,在調用下這個方法就OK了,代碼內容,我想大家都看的明白,就不多介紹了.
效果圖:
樣子雖丑陋了點,但是實現效果就行了,如果在項目中就另當別論了