zoukankan      html  css  js  c++  java
  • Android中动态更新ListView

    在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。
    实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法,判断当列表滑动到最低端时,加载新的列表项。
    其中OnScrollListener接口需要实现如下两个方法:
    onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    view 报告滑动状态的视图
    firstVisibleItem 可视的第一个列表项的索引
    visibleItemCount 可视的列表项个数
    totalItemCount 总共的列表项个数
    onScrollStateChanged(AbsListView view, int scrollState)
    view 报告滑动状态的视图
    scrollState 滑动状态
    滑动状态包括
    SCROLL_STATE_IDLE : 0 视图没有滑动
    SCROLL_STATE_TOUCH_SCROLL : 1 用户正在触摸滑动,手指仍在屏幕上
    SCROLL_STATE_FLING : 2 用户之前触摸滑动,现在正在滑行,直到停止
    下面通过代码给大家演示效果
    main.xml

    1<?xml version="1.0" encoding="utf-8"?>
    2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3    android:orientation="vertical"
    4    android:layout_width="fill_parent"
    5    android:layout_height="fill_parent"
    6    >
    7    <ListView
    8        android:id="@id/android:list"
    9        android:layout_width="match_parent"
    10        android:layout_height="match_parent"
    11        android:layout_weight="1"
    12        android:drawSelectorOnTop="false"
    13        />
    14</LinearLayout>

    footer.xml

    1<?xml version="1.0" encoding="utf-8"?>
    2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3    android:layout_width="fill_parent"
    4    android:layout_height="wrap_content"
    5    android:gravity="center"
    6    android:orientation="horizontal"
    7    >
    8    <ProgressBar
    9        android:id="@+id/progressbar"
    10        android:layout_width="wrap_content"
    11        android:layout_height="wrap_content"
    12        style="\?android:attr/progressBarStyleSmall"
    13        />
    14    <TextView
    15        android:layout_width="wrap_content"
    16        android:layout_height="wrap_content"
    17        android:textSize="20.0sp"
    18        android:text="正在加载..."
    19        />
    20</LinearLayout>

    MainActicity.xml

    1package com.szy.listview;
    2 
    3import android.app.ListActivity;
    4import android.os.Bundle;
    5import android.os.Handler;
    6import android.os.Message;
    7import android.view.Gravity;
    8import android.view.View;
    9import android.view.ViewGroup;
    10import android.widget.AbsListView;
    11import android.widget.BaseAdapter;
    12import android.widget.ListView;
    13import android.widget.TextView;
    14 
    15/**
    16 *@author coolszy
    17 *@date 2012-3-27
    19 */
    20public class MainActivity extends ListActivity
    21{
    22    private ListView mListView;
    23    private CustomAdapter mAdapter;
    24    private int mScrollState;
    25    private View mFooter;
    26 
    27    @Override
    28    public void onCreate(Bundle savedInstanceState)
    29    {
    30        super.onCreate(savedInstanceState);
    31        setContentView(R.layout.main);
    32 
    33        //获取ListView
    34        mListView = getListView();
    35        //根据footer.xml描述创建View
    36        mFooter = getLayoutInflater().inflate(R.layout.footer, null);
    37        // 在ListView底部添加正在加载视图
    38        //注意:addFooterView方法需要在调用setListAdapter方法前调用!
    39        mListView.addFooterView(mFooter);
    40        mAdapter = new CustomAdapter();
    41        setListAdapter(mAdapter);
    42        //给ListView添加滚动监听器
    43        mListView.setOnScrollListener(new AbsListView.OnScrollListener()
    44        {
    45            @Override
    46            public void onScrollStateChanged(AbsListView view, int scrollState)
    47            {
    48                //记录当前状态
    49                mScrollState = scrollState;
    50            }
    51 
    52            @Override
    53            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    54            {
    55                // 可视的最后一个列表项的索引
    56                int lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
    57                //当列表正处于滑动状态且滑动到列表底部时,执行
    58                if (mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE
    59                    && lastVisibleItem == totalItemCount - 1)
    60                {
    61                    // 执行线程,模拟睡眠5秒钟后添加10个列表项
    62                    new Thread()
    63                    {
    64 
    65                        private Handler handler = new Handler()
    66                        {
    67 
    68                            @Override
    69                            public void handleMessage(Message msg)
    70                            {
    71                                super.handleMessage(msg);
    72                                //增加Item数量
    73                                mAdapter.count += 10;
    74                                //通知数据集变化
    75                                mAdapter.notifyDataSetChanged();
    76                            }
    77 
    78                        };
    79 
    80                        @Override
    81                        public void run()
    82                        {
    83                            super.run();
    84                            try
    85                            {
    86                                sleep(5000);
    87                                handler.sendEmptyMessage(0);
    88                            } catch (InterruptedException e)
    89                            {
    90                                e.printStackTrace();
    91                            }
    92                        }
    93 
    94                    }.start();
    95                }
    96            }
    97        });
    98    }
    99 
    100    private class CustomAdapter extends BaseAdapter
    101    {
    102        // 初始列表项数量
    103        int count = 20;
    104 
    105        @Override
    106        public int getCount()
    107        {
    108            return count;
    109        }
    110 
    111        @Override
    112        public Object getItem(int position)
    113        {
    114            return position;
    115        }
    116 
    117        @Override
    118        public long getItemId(int position)
    119        {
    120            return position;
    121        }
    122 
    123        @Override
    124        public View getView(int position, View convertView, ViewGroup parent)
    125        {
    126            TextView result = (TextView) convertView;
    127            //动态创建TextView添加早ListView中
    128            if (result == null)
    129            {
    130                result = new TextView(MainActivity.this);
    131                result.setTextAppearance(MainActivity.this, android.R.style.TextAppearance_Large);
    132                AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams
    133                                                        (AbsListView.LayoutParams.FILL_PARENT,
    134                                                        AbsListView.LayoutParams.WRAP_CONTENT);
    135                result.setLayoutParams(layoutParams);
    136                result.setGravity(Gravity.CENTER);
    137            }
    138            result.setText("第 " + (position + 1)+"行");
    139            return result;
    140        }
    141    }
    142}
  • 相关阅读:
    C语言第0次作业
    C语言博客作业02循环结构
    C语言博客作业04数组
    C语言博客作业03函数
    #C博客作业01分支、顺序结构
    函数
    operation on i may be undefined
    #关于C语言的顺序结构
    关于代码习惯
    VS2019调试的一系列待理解解决问题
  • 原文地址:https://www.cnblogs.com/top5/p/2482234.html
Copyright © 2011-2022 走看看