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

    @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){ // 选择项为1
if(itemnum==(getAdapter().getCount()-1)){// 列表只有一项
setSelector(R.drawable.app_list_corner_round);
}else{ // 列表不止一项
setSelector(R.drawable.app_list_corner_round_top);
}
}else if(itemnum==(getAdapter().getCount()-1)) // 选择项为最后一项
setSelector(R.drawable.app_list_corner_round_bottom);
else{
setSelector(R.drawable.app_list_corner_shape);
}
}
break;
case MotionEvent.ACTION_UP:
break;
}

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

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

    public void setSelectedposition(int selectedposition) {
this.selectedposition = selectedposition;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = inflater.inflate(R.layout.item, null);
if (selectedposition == position) {
v.setBackgroundColor(Color.parseColor("#36adcf"));
} else {
v.setBackgroundColor(Color.TRANSPARENT);
}
return v;
}

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

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

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

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

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

三、ListView列表项延迟加载

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

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

    public int first = 0; // 第一条可视项目
public int visi = 0; // 可视条目总数 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
first = firstVisibleItem;
visi = visibleItemCount;
} public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE: // 滚动完成
mBusy = false;
int first = view.getFirstVisiblePosition();
for (int i = 0; i < visi; i++) { // 设置所有可视条目Tag为null,条目将会自动加载数据
TextView t = (TextView) view.getChildAt(i);
if (t.getTag() != null) {
t.setText(mStrings[first + i]);
t.setTag(null);
}
}break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动(手指未离开屏幕)
mBusy = true;
break;
case OnScrollListener.SCROLL_STATE_FLING: // 正在滚动(手指已离开屏幕)
mBusy = true;
break;
}
}

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

        public View getView(int position, View convertView, ViewGroup parent) {
TextView text;
if (convertView == null) {
text = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
} else {
text = (TextView) convertView;
}
if (!mBusy) {
text.setText(mStrings[position]);
// Tag为空代表当前View的数据已经加载完成
text.setTag(null);
} else {
text.setText("Loading...");
// 非空的View代表当前View仍然需要加载更多的数据
text.setTag("cc");
}
return text;
}
}

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

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

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

    public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
// TODO
return true;
}
}
return false;
}

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

        @Override
public boolean areAllItemsEnabled() {
return false;
} @Override
public boolean isEnabled(int position) {
// TODO 通过一定的判断条件设置position条目可用
}

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

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

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

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

        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); // 设置选择模式
lv.setMultiChoiceModeListener(new ModeCallback());
    private class ModeCallback implements ListView.MultiChoiceModeListener {
public boolean onCreateActionMode(ActionMode mode, Menu menu) { // 在ActionBar上创建按钮
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.list_select_menu, menu);
mode.setTitle("Select Items");
return true;
} public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
} public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
  // TODO 点击某一个按钮的回调
}
return true;
} public void onDestroyActionMode(ActionMode mode) {
} public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) { // 选择项改变回调事件,通过此方法获取选择了哪些项
final int checkedCount = getListView().getCheckedItemCount();
}
}
}

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

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. libevent学习六(Connect listeners )

      创建与释放 //backlog需要查询平台说明,在linux2.2以后 backlog就变成了已完成连接但未accept的队列的最大值(原来是处于syn状态的,现在换成sysctl 控制的参数tc ...

  2. lintcode39 恢复旋转排序数组

    恢复旋转排序数组   给定一个旋转排序数组,在原地恢复其排序. 您在真实的面试中是否遇到过这个题? Yes 说明 什么是旋转数组? 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3 ...

  3. 227. Mock Hanoi Tower by Stacks【LintCode java】

    Description In the classic problem of Towers of Hanoi, you have 3 towers and N disks of different si ...

  4. Wordcount -- MapReduce example -- Reducer

    Reducer receives (key, values) pairs and aggregate values to a desired format, then write produced ( ...

  5. 基于freeRTOS定时器实现闹钟(定时)任务

    基于freeRTOS定时器实现闹钟(定时)任务 在智能硬件产品中硬件中,闹钟定时任务是基本的需求.一般通过APP设置定时任务,从云端或者是APP直连硬件将闹钟任务保存在硬件flash中,硬件运行时会去 ...

  6. SpringCloud IDEA 教学 (一) Eureka的简介与服务注册中心的建立

    写在开头 SpringCloud进来成为业界排名靠前的微服务框架,最核心功能就是搭建微服务,并在此基础上衍生出一系列功能,如断路器(Hystrix).断路监控.管理配置.Zuul.OAuth2等功能. ...

  7. MongoDB Sharding 机制分析

    MongoDB Sharding 机制分析 MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自 ...

  8. Discover the Web(栈模拟)

    Description Standard web browsers contain features to move backward and forward among the pages rece ...

  9. 常用web资源

    ip相关 新浪:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=220.181.38.110 (不带参数本机) ...

  10. Python学习之路3 - 字符串操作&字典

    本节内容: 常用的字符串处理. 格式化输出字符串. 字符串的替换. 字符串和二进制的相互转化. 字典的操作 字符串操作 常用的字符串处理 name = 'vector' print(name.capi ...