首先呢,我们还是看几个示图:(这是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" ><strokeandroid: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" ><strokeandroid:width="1dp"android:color="@color/gray" /><solid android:color="@color/gray" /><cornersandroid: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);}/***** 拦截触摸事件*/@Overridepublic 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/jj120522/article/details/7944916  强烈建议大家看看.

下面一些逻辑虽说没有见过,我想大家都看得懂,(就是获取坐标(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了,代码内容,我想大家都看的明白,就不多介绍了.

效果图:

         

样子虽丑陋了点,但是实现效果就行了,如果在项目中就另当别论了。

哈哈,实现起来简单吧,睡觉去.

下面介绍另外一种解决方法:(TableLayout)

/************************************************************************************************************************************/

对于简短的listview,加上如上面这些比较死的数据,我们完全没有必要用listview来实现,TableLout完全够了.主要是我们怎么实现带有弧度的边罢了,不过这也完全得力于shape的功劳,至于点击效果效果嘛,我们有selector,哈哈,下面介绍下实现:

配置文件部分代码:

    <ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none" ><LinearLayoutandroid:id="@+id/ll_main"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:paddingLeft="10dp"android:paddingRight="10dp" ></LinearLayout></ScrollView>

很简单,我们主要用这个Linerlayout来呈放我们的Table.

实现代码:

package com.jj.corner;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import android.R.color;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;public class MainActivity2 extends Activity {private LinearLayout ll_main;private TableLayout tableLayout;private LinearLayout.LayoutParams layoutParams;private static final String MSG_0[] = { "jjhappyforever" };private static final String MSG_1[] = { "天气动画", "通知栏天气" };private static final String MSG_2[] = { "桌面插件", "绑定微博", "天气分享", "通知与提示","定时播报" };private static final String MSG_3[] = { "检查新版本", "发送建议", "帮助", "关于" };@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main2);ll_main = (LinearLayout) findViewById(R.id.ll_main);showTable();}/**** 显示table*/public void showTable() {layoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);layoutParams.bottomMargin = 30;layoutParams.topMargin = 10;ll_main.addView(getTable(MSG_0), layoutParams);ll_main.addView(getTable(MSG_1), layoutParams);ll_main.addView(getTable(MSG_2), layoutParams);ll_main.addView(getTable(MSG_3), layoutParams);}/**** 获取Table* * @param array* @return*/public TableLayout getTable(String[] array) {tableLayout = new TableLayout(this);tableLayout.setLayoutParams(layoutParams);tableLayout.setStretchAllColumns(true);for (int i = 0; i < array.length; i++) {TableRow tableRow = new TableRow(this);View view = getView(array[i], i, array.length);tableRow.addView(view);tableLayout.addView(tableRow);}return tableLayout;}/***** * @param msg*            显示信息* @param current_Id*            当前个数* @param totle_Num*            总个数* @return*/public View getView(String msg, int current_Id, int totle_Num) {LinearLayout linearLayout = new LinearLayout(this);LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);layoutParams1.height = 1;linearLayout.setOrientation(1);// 创建分割线View line = new View(this);line.setLayoutParams(layoutParams1);line.setBackgroundColor(getResources().getColor(R.color.black));View view = LayoutInflater.from(MainActivity2.this).inflate(R.layout.item, null);view.setBackgroundDrawable(new BitmapDrawable());view.setFocusable(true);view.setClickable(true);TextView textView = (TextView) view.findViewById(R.id.tv_list_item);textView.setText(msg);textView.setTextSize(20);// 只有一项if (totle_Num == 1) {view.setBackgroundResource(R.drawable.default_selector);return view;}// 第一项else if (current_Id == 0) {view.setBackgroundResource(R.drawable.list_top_selector);}// 最后一项else if (current_Id == totle_Num - 1) {view.setBackgroundResource(R.drawable.list_bottom_selector);line.setVisibility(View.GONE);} elseview.setBackgroundResource(R.drawable.list_center_selector);linearLayout.addView(view);linearLayout.addView(line);return linearLayout;}
}

主要是getView有些复杂,不过都很好理解,相信大家都可以明白,只是没有动手做而已,小弟我只是想用这个练练手.

不过不要忘记我们的背景实现

这个是只有一项的背景,

default_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><stroke android:width="1dp" android:color="@color/gray" /><solid android:color="@color/gray" /><corners android:radius="8dp" /></shape></item><item><shape><stroke android:width="1dp" android:color="@color/gray" /><solid android:color="@color/white" /><corners android:radius="8dp" /></shape></item></selector>

list_top_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><stroke android:width="1dp" android:color="@color/gray" /><solid android:color="@color/gray" /><corners android:topLeftRadius="8dp" android:topRightRadius="8dp" /></shape></item><item><shape><solid android:color="@color/white" /><corners android:topLeftRadius="8dp" android:topRightRadius="8dp" /></shape></item></selector>

list_bottom_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><stroke android:width="1dp" android:color="@color/gray" /><solid android:color="@color/gray" /><corners android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp" /></shape></item><item><shape><solid android:color="@color/white" /><corners android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp" /></shape></item></selector>

list_center_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><stroke android:width="1dp" android:color="@color/gray" /><solid android:color="@color/gray" /></shape></item><item><shape><solid android:color="@color/white" /></shape></item></selector>

主要就这么多了,下面我们来看下实现效果:

         

怎么样,效果和上面一样吧,自我感觉这样实现比上面方面点,不过最重要的是因人而异,达成目的就OK了.

有不足的地方请留言指出.

源码下载


由于比较忙碌,顾不得大家一一发送,现将代码上传网上,如有需要,你可以下载查看.

对你如有帮助,记得赞一个!

Thranks for you !

android ListView实现圆角(两种解决方案)相关推荐

  1. 移动端采用Flexible将PX转换REM适配及开发中Retina屏1px边框的两种解决方案

    移动端采用Flexible将PX转换REM适配及开发中Retina屏1px边框的两种解决方案 说明:两个方案均基于Webpack构建. 方案一: 搭建环境及相关配置 webpack 3,需要loade ...

  2. Android 圆形头像的两种实现方式

    Android 圆形头像的两种实现方式 前言 这篇博客只是为了做一个记录而已,方便而后查询,核心代码都是直接采用鸿洋博客里面的代码的. 圆形头像在实际开发中实际很常见,一般来说,主要有两种实现方式: ...

  3. neo4j批量导入数据的两种解决方案

    neo4j批量导入数据的两种解决方案 参考文章: (1)neo4j批量导入数据的两种解决方案 (2)https://www.cnblogs.com/YoungF/p/11632488.html 备忘一 ...

  4. php 嵌套 mysql_PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套_PHP教程

    PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套 一.问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: 1. Transactions cannot be nested. T ...

  5. java多个事件_window.onload绑定多个事件的两种解决方案

    前言 有些函数,必须在网页加载完毕 网页加载完毕时会触发一个onload事件,将函数绑定到这个事件上即可. 复制代码 代码如下: window.onload = myFuncti编程客栈on; 问题来 ...

  6. C# 制作不规则窗体的两种解决方案

    我的广告单元,有空点一下哦,谢谢! 冒着被拍砖的危险,投放到首页.C#制作不规则窗体应该又是一个老生常谈的问题了,可能很多老鸟会带BS的眼神,那么请老鸟们视该文章如浮云吧. 制作不规则窗体,本例采用图 ...

  7. android注册广播两种方式,Android 注册广播的两种方式对比

    Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...

  8. 内核解密 | Oracle 18c 数据库安装ORA-12754的两种解决方案

    Oracle 率先在 Oracle Cloud 上发布了 18c 的数据库版本,也对外发布了针对 Exadata 的下载包.这些软件首先在 Edelivery 网站上提供了下载. 也可以参考公众号之前 ...

  9. Android 更新UI的两种方法——handler和runOnUiThread()

    Android 更新UI的两种方法--handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外 ...

  10. Spring+Dubbo集成Redis的两种解决方案

    Spring+Dubbo集成Redis的两种解决方案 参考文章: (1)Spring+Dubbo集成Redis的两种解决方案 (2)https://www.cnblogs.com/yclimb/p/9 ...

最新文章

  1. Python文本预处理:步骤、使用工具及示例
  2. linux i2c 设备 操作说明
  3. 虚拟化运维工具医院解决方案
  4. mysql怎么按年份分组_mysql - MYSQL按ID分组,但根据最近的年份进行拉取 - SO中文参考 - www.soinside.com...
  5. visio studio json工具_《产品经理入门指南》彩蛋2:别技淫原型图!你的Visio和Balsamiq Mockup入门了吗?...
  6. LinkedHashSet
  7. mysql limit函数
  8. HDFS的JAVA客户端编写
  9. 程序员该不该主动提加薪?| 畅言
  10. 合理使用Blob/Clob
  11. uniapp Android离线打包Activity class {com.xxx.yyy/io.dcloud.PandoraEntry} does not exist.
  12. hbase集群 数据写入_大数据入门必学 - Hbase集群搭建
  13. 施耐德plc地址对应modbus_第446期丨PLC与HMI脚本数据类型交换;继电器触点烧死问题原因分析...
  14. Android手机证书安装
  15. 正则表达式语法和常用表达式列表
  16. 解决 Intel Extreme Tuning Utility(XtuService)的日志占用过大(直接删Logs或卸载)
  17. Jsp中getParameter、getParameterValues、getParameterNames和getParameterMap用法详解
  18. 练习华为大型公司网络构建拓扑图
  19. hive数据库无主键进行去重SQL
  20. 三个重要的事件来看软件测试的重要性和软件测试的行情

热门文章

  1. 云服务器怎么弄mac系统,mac系统在云服务器
  2. Unity Spine插件使用
  3. 关于Spine的一些技巧
  4. 奶爸日记22 - 2021年元旦随记
  5. 微信小程序android拿不到数据,微信小程序奇怪问题,数据获取不到
  6. 成为优秀的UI设计师你需要具备这些能力!
  7. 【Golang】IrIs框架 Hosts
  8. 网络信号简笔画图片大全,网络信号简笔画大全集
  9. 视频画中画制作,视频剪辑教程分享
  10. 牛客网SQL刷题笔记(MySQL)