一、ListView圆角:重写ListView的onInterceptTouchEvent方法,通过pointToPosition(x,y)方法判断当前点击位置所对应的项,有三种情况:分别是第一项、最后一项、中间项;其实第一种情况又分为两种情况:列表总共只有一项和列表不止一项;参照下边的代码即可理解;

  1. @Override
  2. public boolean onInterceptTouchEvent(MotionEvent ev) {
  3. switch (ev.getAction()) {
  4. case MotionEvent.ACTION_DOWN:
  5. int x = (int) ev.getX();
  6. int y = (int) ev.getY();
  7. int itemnum = pointToPosition(x, y);
  8. if (itemnum == AdapterView.INVALID_POSITION)
  9. break;
  10. else{
  11. if(itemnum==0){ // 选择项为1
  12. if(itemnum==(getAdapter().getCount()-1)){// 列表只有一项
  13. setSelector(R.drawable.app_list_corner_round);
  14. }else{ // 列表不止一项
  15. setSelector(R.drawable.app_list_corner_round_top);
  16. }
  17. }else if(itemnum==(getAdapter().getCount()-1)) // 选择项为最后一项
  18. setSelector(R.drawable.app_list_corner_round_bottom);
  19. else{
  20. setSelector(R.drawable.app_list_corner_shape);
  21. }
  22. }
  23. break;
  24. case MotionEvent.ACTION_UP:
  25. break;
  26. }

二、选中项高亮显示,实现ListView选中项高亮显示有两种方法;

1、查看ListView的方法setSelection(int index),看样子好像是,但实际试了之后以现不行,既然不行,那就用一个比较笨的方法:自定义adapter,在adapter的getView方法里面设置背景;然后在ListView的onItemClick回调中向adapter传入点击的项,即可设置选中项高亮状态;

  1. public void setSelectedposition(int selectedposition) {
  2. this.selectedposition = selectedposition;
  3. }
  4.  
  5. @Override
  6. public View getView(int position, View convertView, ViewGroup parent) {
  7. View v = inflater.inflate(R.layout.item, null);
  8. if (selectedposition == position) {
  9. v.setBackgroundColor(Color.parseColor("#36adcf"));
  10. } else {
  11. v.setBackgroundColor(Color.TRANSPARENT);
  12. }
  13. return v;
  14. }

2、有没有更简单的方法?第一种方法看着觉得有点怪怪的,有点歪门邪道的感觉;另一种的方法是通过selector方法实现;定义一个drawable文件,里面包含一个选择状态:state_activated,然后将这个drawable指定为ListView的item的背景;关于这个状态具体含意不再多说,参见官方api;

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:drawable="@drawable/adcf" android:state_activated="true"></item>
  4. <item android:drawable="@android:color/transparent"/>
  5. </selector>

下面是在代码中的实现(部分代码):

  1. listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  1. @Override
  2. protected void onListItemClick(ListView l, View v, int position, long id) {
  3. getListView().setItemChecked(position, true);
  4. }

注:上面的方法是ListActivity的方法,此方法对应OnItemClickListener接口中的方法;

三、ListView列表项延迟加载

我们都知道当ListView上面滚动时,会执行adapter的getView方法,但问题出来了,有时候为了节约资源及解决效率问题,并不需要滚动到某一项就开始加载数据,而是希望滚动停止,或者说滚动速度低于某一个值时才获取数据,下面讨论的就是这种情况下的处理:

1、为ListView添加OnScrollListener滚动监听器,此监听器可以获取当前滚动状态及可视条目;

  1. public int first = 0; // 第一条可视项目
  2. public int visi = 0; // 可视条目总数
  3.  
  4. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  5. first = firstVisibleItem;
  6. visi = visibleItemCount;
  7. }
  8.  
  9. public void onScrollStateChanged(AbsListView view, int scrollState) {
  10. switch (scrollState) {
  11. case OnScrollListener.SCROLL_STATE_IDLE: // 滚动完成
  12. mBusy = false;
  13. int first = view.getFirstVisiblePosition();
  14. for (int i = 0; i < visi; i++) { // 设置所有可视条目Tag为null,条目将会自动加载数据
  15. TextView t = (TextView) view.getChildAt(i);
  16. if (t.getTag() != null) {
  17. t.setText(mStrings[first + i]);
  18. t.setTag(null);
  19. }
  20. }break;
  21. case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动(手指未离开屏幕)
  22. mBusy = true;
  23. break;
  24. case OnScrollListener.SCROLL_STATE_FLING: // 正在滚动(手指已离开屏幕)
  25. mBusy = true;
  26. break;
  27. }
  28. }

在Adapter中根据mBusy状态,判断是否立即加载数据,重写getView方法;

  1. public View getView(int position, View convertView, ViewGroup parent) {
  2. TextView text;
  3. if (convertView == null) {
  4. text = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
  5. } else {
  6. text = (TextView) convertView;
  7. }
  8. if (!mBusy) {
  9. text.setText(mStrings[position]);
  10. // Tag为空代表当前View的数据已经加载完成
  11. text.setTag(null);
  12. } else {
  13. text.setText("Loading...");
  14. // 非空的View代表当前View仍然需要加载更多的数据
  15. text.setTag("cc");
  16. }
  17. return text;
  18. }
  19. }

四、类似聊天记录,自动将新添加的项从底部添加并显示到可见区域,主要是两个属性的设置,如下:

  1. <ListView
  2. android:id="@android:id/list"
  3. android:layout_width="match_parent"
  4. android:layout_height="0dip"
  5. android:layout_weight="1"
  6. android:stackFromBottom="true" 自动显示到列表最底部
  7. android:transcriptMode="normal" /> 设置当显示大量的条目时,希望将最新的item显示到可见区域

顺便记录一下输入框点击Enter事件,OnKeyListener(参照下面的代码,可实现输入新消息按下Enter并将新消息添加到列表底部);

  1. public boolean onKey(View v, int keyCode, KeyEvent event) {
  2. if (event.getAction() == KeyEvent.ACTION_DOWN) {
  3. switch (keyCode) {
  4. case KeyEvent.KEYCODE_DPAD_CENTER:
  5. case KeyEvent.KEYCODE_ENTER:
  6. // TODO
  7. return true;
  8. }
  9. }
  10. return false;
  11. }

五、设置部分条目不可用:通常情况下,一个列表中的所有条目都可以使用,也即可以响应点击事件和有点击的效果,但有的情况下,并不希望所有的条目都这样,就可以自定义Adapter,通过条目的相关属性判断是否可用,(disEnabled状态下,默认的分割条不显示)

  1. @Override
  2. public boolean areAllItemsEnabled() {
  3. return false;
  4. }
  5.  
  6. @Override
  7. public boolean isEnabled(int position) {
  8. // TODO 通过一定的判断条件设置position条目可用
  9. }

六、ListView点击条目展开条目显示更多信息:这种情况也是比较常见的,最多见的应该是评论,一个评论列表,不同的人,评论的内容长度不同,如果全部显示完,就会显示得参差不齐,但又不能只显示了部分,此时就得添加点击条目查看更多的功能了;

  简单说下思路:自定义一个View,继承自FrameLayout,里面有两个TextView,一个是单行的(singleLine),另外一个是多行的(wrap_content);公开一个方法设置多行的TextView的可见状态为VISIBLE或者GONE,在ListView的ItemClick回调中设置当列表条目未展开时,点击条目展开条目,也即显示更多信息;当列表是展开的,点击收起条目;并且通知数据源改变:notifyDataSetChanged;

七、在二中说了选中单项的高亮显示,现在来看看多选的高亮显示,同样,多选我这里也知道两种方法;

1、同二中第2种方法,定义一个selector,里面包含一个选择状态state_activited,将此drawable设置为ListView的selector或者是直接设置为条目的背景;此种模式类似于4.0之后部分手机短信列表的长按之后进行选择条目然后进行操作删除的效果;

  1. lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); // 设置选择模式
  2. lv.setMultiChoiceModeListener(new ModeCallback());
  1. private class ModeCallback implements ListView.MultiChoiceModeListener {
  2. public boolean onCreateActionMode(ActionMode mode, Menu menu) { // 在ActionBar上创建按钮
  3. MenuInflater inflater = getMenuInflater();
  4. inflater.inflate(R.menu.list_select_menu, menu);
  5. mode.setTitle("Select Items");
  6. return true;
  7. }
  8.  
  9. public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
  10. return true;
  11. }
  12.  
  13. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  14. switch (item.getItemId()) {
  15.   // TODO 点击某一个按钮的回调
  16. }
  17. return true;
  18. }
  19.  
  20. public void onDestroyActionMode(ActionMode mode) {
  21. }
  22.  
  23. public void onItemCheckedStateChanged(ActionMode mode, int position,
  24. long id, boolean checked) { // 选择项改变回调事件,通过此方法获取选择了哪些项
  25. final int checkedCount = getListView().getCheckedItemCount();
  26. }
  27. }
  28. }

2、第二种方法比较简单些,适用范围更加广泛,上一种方法在2.x的版本上运行会出错,因为MultiChoiceMode是高版本上的新的一个接口;对于低版本的手机,下面这种方法更加适用(Item的背景或者selector同上);

  1. lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

如果需要获取此种方法的选择项,就需要在OnItemClickListener的回调方法中进行判断,即每点击一项,改变当前checked的值,最后再获取结果;

未完待续。。。

Android ListView各种效果实现总结,持续更新...的更多相关文章

  1. Android 常用开源库总结(持续更新)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  2. Android中常用开发工具类—持续更新...

    一.自定义ActionBar public class ActionBarTool { public static void setActionBarLayout(Activity act,Conte ...

  3. android 编译环境 & 开发教程 【持续更新】

    一. 优秀博文推荐 1.ubuntu 搭建 android源码编译环境 ubuntu14.04LTS android 源码编译环境的搭建 2.开源网站 2.android 开源 网站 2015最流行的 ...

  4. android ListView中含有按钮事件实时更新ListView数据案例

    1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...

  5. Android中AlarmManager使用示例(持续更新,已经更改)

    现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...

  6. Android常用开源库集合【持续更新】

    1.FastJson  阿里巴巴工程师做的一个方便的JSON转换库 2.ButterKnife 只要作用能代替代码中大量的findviewbyid语句的使用,使用@injectview注入方式 3.v ...

  7. CSS效果集锦(持续更新中)

    高亮光弧效果 使用CSS3实现的一个高亮光弧效果,当鼠标hover到某一个元素上时,一道光弧从左向右闪过,效果如下: 代码如下: <!DOCTYPE html> <html lang ...

  8. Android Studio的安装使用记录[持续更新]

    参考资料: Windows环境下Android Studio v1.0安装教程 http://ask.android-studio.org/?/article/9 1. 下载与安装 在http://w ...

  9. Android Studio快捷键指南(本文持续更新)

    这是我在使用Android Studio过程中接触到的一些快捷键,和大家分享,后面会继续完善此文,也欢迎大家踊跃补充,一起完善. 快捷键 删除并剪贴行:Ctrl+X 复制一行:Ctrl+D 代码格式整 ...

随机推荐

  1. CentOS 7.2使用源码包编译安装MySQL 5.7.22及一些操作

    CentOS 7.2使用源码包编译安装MySQL 5.7.22及一些操作 2018年07月05日 00:28:38 String峰峰 阅读数:2614   使用yum安装的MySQL一般版本比较旧,但 ...

  2. Ubuntu配置IP

    Ubuntu网络配置的常用系统,于是我学习研究了Ubuntu网络配置,在这里对大家详细介绍下Ubuntu网络配置应用,希望对大家有用Ubuntu网络配置包含了非常好的翻译和容易使用的架构./etc/n ...

  3. 学会了vim中的自动补全功能

    好开心,再也不用再多个工具之间切换了,哈哈 擦,功能太弱

  4. hdu2509Be the Winner(反nim博弈)

    Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. HTTP基本定义

    一.网络的简单定义: 1.http:是www服务器传输超文本向本地浏览器的传输协议.(应用层) 2.IP:是计算机之间相互识别通信的机制.(网络层) 3.TCP:是应用层通信之间通信.(传输层) IP ...

  6. python学习笔记04 --------------基本运算符

    1.算数运算 + 加 - 减 * 乘 /   除 % 取模(先做除法,然后返回余数) ** 乘方(幂运算) //          取整(相除,然后返回商的整数部分) 2.比较运算(返回布尔值) == ...

  7. C# 中访问修饰符

    1.public 完全公开的,公共的 2. private 私有的,只能在当前类的内部访问, 不可修饰类 3.protected 受保护的,只能在当前类的内部以及其子类中访问,不能用来修饰类 4.in ...

  8. 【CQOI 2007】 余数求和

    题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 ...

  9. 2018牛客多校第二场a题

    一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态  对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示 ...

  10. jmeter链接数据库问题汇总

    1.最新驱动下载: 驱动版本与mysql服务不兼容也是会报错的 下载地址:https://dev.mysql.com/downloads/connector/j/ 打开页面一直拉到页面底部,此处选择P ...