Android UI控件之ListView实现圆角效果

http://blog.csdn.net/lcore/article/details/8714148

       今天在Android群里面有人再求圆角ListView的实现方式,正好自己以前实现过。因此就共享了

       现在将其实现方式写在博客中共他人学习。给出实现方式之前顺带加点自己的想法,感觉上android

       中方形的ListView还是太“硬性”,没有圆角的有亲和力。连Apple也为了“圆角”这个设计去申请专利

       看来圆角确实比较适合现在人们的喜好吧。

              照老规矩先上两张效果图吧:

       第一张:

      第二张:

          该方式主要就是需要重新去实现自己的ListView代码如下:

  1. package com.kiritor.corner_listview;  
  2.   
  3.   
  4. import android.content.Context;  
  5. import android.util.AttributeSet;  
  6. import android.view.MotionEvent;  
  7. import android.widget.AdapterView;  
  8. import android.widget.ListView;  
  9.   
  10. /*** 
  11.  * 自定义listview 
  12.  *  
  13.  * @author Kiritor 
  14.  *  
  15.  */  
  16. public class MyListView extends ListView {  
  17.     public MyListView(Context context) {  
  18.         super(context);  
  19.     }  
  20.   
  21.     public MyListView(Context context, AttributeSet attrs) {  
  22.         super(context, attrs);  
  23.     }  
  24.   
  25.     /**** 
  26.      * 拦截触摸事件 
  27.      */  
  28.     @Override  
  29.     public boolean onTouchEvent(MotionEvent ev) {  
  30.         switch (ev.getAction()) {  
  31.         case MotionEvent.ACTION_DOWN:  
  32.             int x = (int) ev.getX();  
  33.             int y = (int) ev.getY();  
  34.             int itemnum = pointToPosition(x, y);  
  35.             if (itemnum == AdapterView.INVALID_POSITION)  
  36.                 break;  
  37.             else {  
  38.                 if (itemnum == 0) {  
  39.                     if (itemnum == (getAdapter().getCount() - 1)) {  
  40.                         // 只有一项数据,设置背景设置为圆角的  
  41.                         setSelector(R.drawable.list_round);  
  42.                     } else {  
  43.                         // 第一项,设置为上面为圆角的  
  44.                         setSelector(R.drawable.list_top_round);  
  45.                     }  
  46.                 } else if (itemnum == (getAdapter().getCount() - 1))  
  47.                     // 最后一项,设置为下面为圆角的  
  48.                     setSelector(R.drawable.list_bottom_round);  
  49.                 else {  
  50.                     // 中间项,不用设置为圆角  
  51.                     setSelector(R.drawable.list_center_round);  
  52.                 }  
  53.             }  
  54.             break;  
  55.         case MotionEvent.ACTION_UP:  
  56.             break;  
  57.         }  
  58.         return super.onTouchEvent(ev);  
  59.     }  
  60. }  
          MainActivity
  1. package com.kiritor.corner_listview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7.   
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.view.Window;  
  14. import android.widget.AdapterView;  
  15. import android.widget.AdapterView.OnItemClickListener;  
  16. import android.widget.ArrayAdapter;  
  17. import android.widget.ListAdapter;  
  18. import android.widget.ListView;  
  19. import android.widget.SimpleAdapter;  
  20. import android.widget.Toast;  
  21.   
  22. public class MainActivity extends Activity implements OnItemClickListener {  
  23.     private MyListView listView_1, listView_2, listView_3;  
  24.     private ArrayList<Map<String, String>> listData, listData2, listData3;  
  25.     private SimpleAdapter adapter;  
  26.   
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  31.         setContentView(R.layout.main);  
  32.         listView_1 = (MyListView) findViewById(R.id.mylistview_1);  
  33.         listView_2 = (MyListView) findViewById(R.id.mylistview_2);  
  34.         listView_3 = (MyListView) findViewById(R.id.mylistview_3);  
  35.   
  36.         listView_1.setAdapter(getSimpleAdapter_1());  
  37.         listView_2.setAdapter(getSimpleAdapter_2());  
  38.         listView_3.setAdapter(getSimpleAdapter_3());  
  39.   
  40.         listView_1.setOnItemClickListener(this);  
  41.         listView_2.setOnItemClickListener(this);  
  42.         listView_3.setOnItemClickListener(this);  
  43.   
  44.         setListViewHeightBasedOnChildren(listView_1);  
  45.         setListViewHeightBasedOnChildren(listView_2);  
  46.         setListViewHeightBasedOnChildren(listView_3);  
  47.     }  
  48.   
  49.     /** 
  50.      * 设置第一列数据 
  51.      */  
  52.     private SimpleAdapter getSimpleAdapter_1() {  
  53.         listData = new ArrayList<Map<String, String>>();  
  54.   
  55.         Map<String, String> map = new HashMap<String, String>();  
  56.         map.put("text""天气动画");  
  57.         listData.add(map);  
  58.   
  59.         map = new HashMap<String, String>();  
  60.         map.put("text""通知栏天气");  
  61.         listData.add(map);  
  62.   
  63.         return new SimpleAdapter(MainActivity.this, listData,  
  64.                 R.layout.list_item, new String[] { "text" },  
  65.                 new int[] { R.id.tv_list_item });  
  66.   
  67.     }  
  68.   
  69.     /** 
  70.      * 设置第二列数据 
  71.      */  
  72.     private SimpleAdapter getSimpleAdapter_2() {  
  73.         listData2 = new ArrayList<Map<String, String>>();  
  74.   
  75.         Map<String, String> map = new HashMap<String, String>();  
  76.         map.put("text""桌面插件");  
  77.         listData2.add(map);  
  78.   
  79.         map = new HashMap<String, String>();  
  80.         map.put("text""绑定微博");  
  81.         listData2.add(map);  
  82.   
  83.         map = new HashMap<String, String>();  
  84.         map.put("text""天气分享");  
  85.         listData2.add(map);  
  86.   
  87.         map = new HashMap<String, String>();  
  88.         map.put("text""通知与提示");  
  89.         listData2.add(map);  
  90.   
  91.         map = new HashMap<String, String>();  
  92.         map.put("text""定时播报");  
  93.         listData2.add(map);  
  94.   
  95.         return new SimpleAdapter(MainActivity.this, listData2,  
  96.                 R.layout.list_item, new String[] { "text" },  
  97.                 new int[] { R.id.tv_list_item });  
  98.   
  99.     }  
  100.   
  101.     /** 
  102.      * 设置第三列数据 
  103.      */  
  104.     private SimpleAdapter getSimpleAdapter_3() {  
  105.         listData3 = new ArrayList<Map<String, String>>();  
  106.   
  107.         Map<String, String> map = new HashMap<String, String>();  
  108.         map.put("text""检查新版本");  
  109.         listData3.add(map);  
  110.   
  111.         map = new HashMap<String, String>();  
  112.         map.put("text""发送建议");  
  113.         listData3.add(map);  
  114.   
  115.         map = new HashMap<String, String>();  
  116.         map.put("text""帮助");  
  117.         listData3.add(map);  
  118.   
  119.         map = new HashMap<String, String>();  
  120.         map.put("text""关于");  
  121.         listData3.add(map);  
  122.   
  123.         return new SimpleAdapter(MainActivity.this, listData3,  
  124.                 R.layout.list_item, new String[] { "text" },  
  125.                 new int[] { R.id.tv_list_item });  
  126.   
  127.     }  
  128.   
  129.     /*** 
  130.      * 动态设置listview的高度 
  131.      *  
  132.      * @param listView 
  133.      */  
  134.     public void setListViewHeightBasedOnChildren(ListView listView) {  
  135.         ListAdapter listAdapter = listView.getAdapter();  
  136.         if (listAdapter == null) {  
  137.             return;  
  138.         }  
  139.         int totalHeight = 0;  
  140.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  141.             View listItem = listAdapter.getView(i, null, listView);  
  142.             listItem.measure(00);  
  143.             totalHeight += listItem.getMeasuredHeight();  
  144.         }  
  145.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  146.         params.height = totalHeight  
  147.                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  148.         // params.height += 5;// if without this statement,the listview will be  
  149.         // a  
  150.         // little short  
  151.         // listView.getDividerHeight()获取子项间分隔符占用的高度  
  152.         // params.height最后得到整个ListView完整显示需要的高度  
  153.         listView.setLayoutParams(params);  
  154.     }  
  155.   
  156.     @Override  
  157.     public void onItemClick(AdapterView<?> parent, View view, int position,  
  158.             long id) {  
  159.           
  160.         if (parent == listView_1) {  
  161.             Map<String, String> map = listData.get(position);  
  162.             Toast.makeText(MainActivity.this, map.get("text"), 1).show();  
  163.         } else if (parent == listView_2) {  
  164.             Map<String, String> map = listData2.get(position);  
  165.             Toast.makeText(MainActivity.this, map.get("text"), 1).show();  
  166.         } else if (parent == listView_3) {  
  167.             Map<String, String> map = listData3.get(position);  
  168.             Toast.makeText(MainActivity.this, map.get("text"), 1).show();  
  169.         }  
  170.   
  171.     }  
  172.   
  173. }  
               差不多也就是这样了,还有相关资源文件

                       

                这里就不一一给出了

                完整源码部分:

                       http://download.csdn.net/detail/kiritor/5176655
weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
weixin102旅游社交微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值