Android ListView實現圓角
首先呢,我們還是看幾個示圖:(這是360推出的一款天氣預報APP(墨跡),很不錯的一款哦,這里為她們做一個免費廣告,哈哈.)

這種帶有圓角的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了,代碼內容,我想大家都看的明白,就不多介紹了.
效果圖:

樣子雖丑陋了點,但是實現效果就行了,如果在項目中就另當別論了。
轉自:http://blog.csdn.net/jj120522/article/details/7944484