美文网首页
ListView基本使用

ListView基本使用

作者: 一毫米距离 | 来源:发表于2017-12-08 20:38 被阅读4次

    1.定义继承于AppCompatActivity 的MyActivity 设置布局

        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.ha);
            listViewAdpater adapter = new listViewAdpater(this,items);
            ListView ls = (ListView)findViewById(R.id.ls1);
            ls.setAdapter(adapter);
    //
        }
    

    适配器listViewAdpater

    1.重写getItem getItemId 方法
    2.定义ViewHolder 里面保存布局子项的元素
    3.重写getView函数 此函数中 使用inflater.inflate 加载布局子项 特别要注意getView写法 先判断convertView是否为空 如果为空 加载布局子项 并且创建holder 并对hoder的属性赋值 并且保存在view 中() view.setTag(holder);
    如果不为空view=convertView 并且从view中获取hoderview.getTag();
    最后对holder的控件进行赋值(设置文本 图片等)

    public class listViewAdpater extends BaseAdapter {
        private List<ListViewItem> list;
        private LayoutInflater inflater;
    
        public listViewAdpater(Context context,List<ListViewItem>items)
        {
            inflater = LayoutInflater.from(context);
            list = items;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            View view;
            ViewHolder holder;
            ListViewItem item = (ListViewItem) list.get(position);
            if (convertView == null)
            {
                view = inflater.inflate(R.layout.listviewtest,parent,false);
                holder =  new ViewHolder();
                holder.userImg = (ImageView) view.findViewById(R.id.user_header_img);
                holder.userComment = (TextView) view.findViewById(R.id.user_coomment);
                holder.userName = (TextView) view.findViewById(R.id.user_name);
                view.setTag(holder);
             }
            else
            {
                view = convertView;
                holder = (ViewHolder) view.getTag();
            }
    //        holder.userImg.setImageResource(item.getUserImg());
            holder.userName.setText(item.getUserName());
            holder.userComment.setText(item.getUserComment());
            return view;
        }
    
        @Override
        public Object getItem(int position) {
            return list.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
        public class ViewHolder {
            //用户头像
            ImageView userImg;
            //用户名字
            TextView userName;
            //用户的评论
            TextView userComment;
        }
    }
    

    下拉刷新 google官方下拉刷新

    1.布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_google_and_loadmore_refresh_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <com.example.myfirst.pulltorefreshlist.LoadMoreListView
                android:id="@+id/google_and_loadmore_refresh_listview"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
            </com.example.myfirst.pulltorefreshlist.LoadMoreListView>
    
        </android.support.v4.widget.SwipeRefreshLayout>
    </LinearLayout>
    

    2.实现 SwipeRefreshLayout.OnRefreshListener接口

    1.设置下拉刷新的样式

        private void initEvent() {
            swipeRefreshLayout.setOnRefreshListener(this);
    
            //设置圆圈进度条的背景颜色
    //        swipeRefreshLayout.setProgressBackgroundColorSchemeColor(
    //                getResources().getColor(R.color.colorPrimary));
    
            //设置进度条变化的颜色
            swipeRefreshLayout.setColorSchemeResources(
                    R.color.firstColor,
                    R.color.secondColor,
                    R.color.thirdColor,
                    R.color.forthColor,
                    R.color.thirdColor
                    );
    
        }
    

    2.下拉刷新事件

        /**
         * 触发了下拉刷新事件,就会执行onRefresh()方法,这样就能在这个
         * 方法中去执行网络获取最新的数据,然后再刷新到listview上面
         */
        @Override
        public void onRefresh() {
            //因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
            // 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //获取最新的list数据
                    setRefreshData();
                    //通知界面显示,
                    adapter.notifyDataSetChanged();
                    // 通知listview刷新数据完毕,让listview停止刷新
                    swipeRefreshLayout.setRefreshing(false);
                }
            }, 6000);
        }
    

    上拉加载更多

    1.自定义ListView

    package com.example.myfirst.pulltorefreshlist;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.ListView;
    
    /**
     * 上拉加载更多的listView,配合Google官方的下拉刷新使用
     * Created by chengguo on 2016/3/21.
     */
    public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {
    
    
        private static final String TAG = "RefreshListView";
        /**
         * 底部加载更多部分
         */
        private boolean isScrollToBottom;//判断是不是滑到了底部
        private View footerView; //底部的footer   view
        private int footerViewHeight; //底部view的高度
        private boolean isLoadingMore = false; //判断是不是"加载更多"
    
        /**
         * listview的接口,监听listview的下来刷新和上拉加载更多
         */
        private OnRefreshListener mOnRefreshListener;
    
    
        public LoadMoreListView(Context context) {
            super(context);
        }
    
        public LoadMoreListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initFooterView();
            this.setOnScrollListener(this);
        }
    
    
        /**
         * 初始化底部view
         */
        private void initFooterView() {
            footerView = View.inflate(getContext(), R.layout.footer_layout, null);
            //设置(0,0)以便系统测量footerView的宽高
            footerView.measure(0, 0);
            footerViewHeight = footerView.getMeasuredHeight();
            footerView.setPadding(0, -footerViewHeight, 0, 0);
            this.addFooterView(footerView);
        }
    
        /**
         * 监听listview滚动的状态变化,如果滑到了底部,就“加载更多..."
         */
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
    
            if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) {
                if (isScrollToBottom && !isLoadingMore) {
                    isLoadingMore = true;
                    footerView.setPadding(0, 0, 0, 0);
                    this.setSelection(this.getCount());
    
                    if (mOnRefreshListener != null) {
                        mOnRefreshListener.onLoadingMore();
                    }
                }
            }
        }
    
        /**
         * 监听listview滚动的状态变化,判断当前是不是滑到了底部
         *
         * @param view
         * @param firstVisibleItem
         * @param visibleItemCount
         * @param totalItemCount
         */
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (getLastVisiblePosition() == (totalItemCount - 1)) {
                isScrollToBottom = true;
            } else {
                isScrollToBottom = false;
            }
    
        }
    
        /**
         * 设置监听接口,当为
         *
         * @param listener
         */
        public void setOnRefreshListener(OnRefreshListener listener) {
            mOnRefreshListener = listener;
        }
    
    
        /**
         * 为外界提供的方法,当Activity中的加载更多数据加载完后,就调用这个方法来隐藏底部的footerView
         */
        public void loadMoreComplete() {
            footerView.setPadding(0, -footerViewHeight, 0, 0);
            isLoadingMore = false;
        }
    
        /**
         * 设置接口,供外界实现,监听listview的刷新和加载更多的状态
         */
        public interface OnRefreshListener {
            /**
             * 上拉加载更多
             */
            void onLoadingMore();
        }
    }
    
    

    上拉加载更多使用
    1 实现 LoadMoreListView.OnRefreshListener接口

        /**
         * ”加载更多“ 的回调接口方法
         */
        @Override
        public void onLoadingMore() {
    
            //因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
            // 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //获取最新的list数据
                    setRefreshData();
                    //通知界面显示,
                    adapter.notifyDataSetChanged();
                    // 通知listview刷新数据完毕,让listview停止刷新,取消加载跟多
                    loadMoreListView.loadMoreComplete();
                }
            }, 6000);
        }
    

    相关文章

      网友评论

          本文标题:ListView基本使用

          本文链接:https://www.haomeiwen.com/subject/ajjyixtx.html