Android ListView零碎知识点总结

本文深入解析了ListView组件的高级用法,包括自定义Adapter实现不同类型的数据展示,头尾布局的添加,空布局设置,以及复杂的点击事件处理。同时,介绍了如何通过OnScrollListener实现滑动到底部自动加载更多数据,以及各种滚动、选择和样式设置的方法。

 

ListView的使用很广泛,也有很多小的设置方法;

 

Adapter作为ListView和数据源的适配器;

 

public class MessageAdapter extends BaseAdapter {

    private static final int ViewTypeCount = 2;

    private interface ViewType {
        int TEXT = 0;
        int IMAGE = 1;
    }

    private List<Object> messageList;

    public MessageAdapter(List<Object> messageList) {
        this.messageList = messageList;
    }

    @Override
    public int getCount() {
        return messageList.size();
    }

    @Override
    public Object getItem(int position) {
        return messageList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //获取ViewType的总量
    @Override
    public int getViewTypeCount() {
        return ViewTypeCount;
    }

    //获取指定位置item的ViewType
    @Override
    public int getItemViewType(int position) {
        if (getItem(position) instanceof String) {
            return ViewType.TEXT;
        } else {
            return ViewType.IMAGE;
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        ViewHolder holder;
        if (getItemViewType(position) == ViewType.TEXT) {
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.item_text, parent, false);
                TextView one = convertView.findViewById(R.id.one);
                TextView two = convertView.findViewById(R.id.two);
                holder = new ViewHolder(one, two);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
        } else {
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.item_image, parent, false);
                TextView one = convertView.findViewById(R.id.one);
                TextView two = convertView.findViewById(R.id.two);
                holder = new ViewHolder(one, two);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
        }

        holder.getOne().setText("");
        holder.getTwo().setText("");
        return convertView;
    }

    public static class ViewHolder {
        private TextView one;
        private TextView two;

        public ViewHolder(TextView one, TextView two) {
            this.one = one;
            this.two = two;
        }

        public TextView getOne() {
            return one;
        }

        public TextView getTwo() {
            return two;
        }

        public void refreshContent(String one){
            this.one.setText(one);
        }

    }

}

 

ListView添加头布局:

View headerView = LayoutInflater.from(this).inflate(R.layout.header_view, listview, false);
listview.addHeaderView(headerView);

ListView添加尾部局:

View footerView = LayoutInflater.from(this).inflate(R.layout.footer_view, listview, false);
listview.addFooterView(footerView);

ListView设置空布局:

View emptyView = findViewById(R.id.empty_view);
listview.setEmptyView(emptyView);

ListView添加头/尾布局后设置item点击事件时,数据源的position取值问题:

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          mData.get(position);
          mAdapter.getItem(position);
          parent.getItemAtPosition(position);//最正确的获取
     }
});
         /**
         * 如果ListView的item中存在button,会使item点击无效,
         * 解决办法是在button上添加:
         * android:focusable = "false"
         * 或者是在根布局添加:
         * android:descendantFocusability = "blocksDescendants"
         */

 

ListView滑动到底部自动刷新:

         /**
         * OnScrollListener
         * ListView停止滑动
         * public static int SCROLL_STATE_IDLE = 0;
         * 手指还停留在屏幕上,ListView随着手指的滑动而滑动
         * public static int SCROLL_STATE_IDLE = 1;
         * 手指已经离开屏幕,ListView还在随着惯性滑动
         * public static int SCROLL_STATE_IDLE = 2;
         */
        listview.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                Log.e("", "");
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem + visibleItemCount == totalItemCount) {
                    loadData();
                    mAdapter.notifyDataSetChanged();
                }
            }
        });

 

        /**
         * setSelection
         * 滑动到某一个item
         * public void setSelection(int position);
         * 滑动到某一个item,并距离顶部多少:y为正,表示遮挡多少距离
         * public void setSelectionFromTop(int position,int y);
         *
         */

 

        /**
         * scrollbars
         *
         * fadeScrollbars
         * true:滑动结束隐藏滑动条
         * false:一直显示滑动条
         *
         * fastScrollEnabled
         * true:开始滑动的时候改变样式,变成可拖动条
         *
         * fastScrollAlwaysVisible
         * true:可拖动条一直显示
         *
         * overScrollMode
         * always:拖动到边界还可以继续拉
         * never:拖动到边界还不可以继续拉
         * ifContentScrolls:如果内容可以滚动就可以继续拉,如果内容不饿可以滚动就不可以继续拉
         *
         * overScrollHeader
         * overScrollFooter
         * 继续拖动多出来的地方的颜色
         *
         * requiresFadingEdge = vertical
         * fadingEdgeLength = 100dp
         * cacheColorHint = "#0F0F0F"
         * 边缘部分有遮挡的渐变效果
         * scrollingCache
         * false:滑动的时候内容部分不显示颜色
         * true:滑动的时候内容部分显示颜色
         *
         * listSelector
         * 设置点击的时候item的背景颜色
         * drawSelectorOnTop
         * true:背景颜色遮罩内容
         *
         * divider
         * @null 没有分割线
         * 颜色 分割线颜色
         * dividerHeight
         * 分割线颜色
         * headerDividerEnable
         * footerDividerEnable
         * headerView/footerView和内容之间的分割线是否显示
         *
         * stackFromBottom
         * 从最底部到顶部进行布局
         *
         * transcriptMode
         * alwaysScroll:添加项的时候会滑动到最底部
         * normal:添加项的时候在最底部会滑动到最底部,否则不会
         * disable:添加项的时候不会滑动到最底部
         *
         */

ListView刷新某一个数据

    private void partialRefresh(ListView listView, int position) {
        if (position >= listView.getFirstVisiblePosition()
                && position <= listView.getLastVisiblePosition()) {
            int childIndex = position - listView.getFirstVisiblePosition();
            View child = listView.getChildAt(childIndex);
            if (child.getTag() instanceof MessageAdapter.ViewHolder) {
                ((MessageAdapter.ViewHolder) child.getTag()).refreshContent("");
            }
        }
    }

 

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值