ListView的加载更多的写法

思路:

1.自定义加载更多的布局
2.自定义listview,初始化布局加载更多的布局文件
3.设置自定义listview的滑动监听事件
4.定义接口,回调加载更多的数据

代码实现部分:

1.加载更多的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_marginTop="5dp"
        android:paddingBottom="3dp"
        android:paddingTop="3dp"
        android:id="@+id/layout"
        android:gravity="center"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/progressbar"/>

        <TextView
            android:layout_marginLeft="8dp"
            android:textSize="18dp"
            android:text="加载更多...."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text_loading"/>

    </LinearLayout>

</LinearLayout>
2.自定义listview,初始化布局加载更多的布局文件,设置滑动监听事件,定义接口回调加载更多的数据
public class LoadListview extends ListView implements AbsListView.OnScrollListener{

    private LayoutInflater inflater;
    private View footer;    // 底部的加载更多布局
    private View ll_layout_bottom;
    private int totalItemCount; // 总的条目数
    private int lastItemCount;  // 最后一个条目数
    private boolean isLoading;
    private ILoadListeer iLoadListeer;

    public LoadListview(Context context) {
        super(context);
        initView(context);
    }

    public LoadListview(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public LoadListview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    private void  initView(Context context){
        inflater = LayoutInflater.from(context);
        footer = inflater.inflate(R.layout.bottom_layout, null);
        ll_layout_bottom = footer.findViewById(R.id.layout);
        ll_layout_bottom.setVisibility(View.GONE);
        // 添加布局到底部
        this.addFooterView(footer);
        // 设置listview的滑动监听事件
        this.setOnScrollListener(this);

    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    // 如果当前的最后一个可见的条目数是总的条目数,并且是处于滑动停止的状态
        if (totalItemCount == lastItemCount && scrollState == SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading = true;
                // 设置是条目可见的
                ll_layout_bottom.setVisibility(View.VISIBLE);
                // 加载更多数据
                iLoadListeer.onLoad();
            }

        }

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.totalItemCount = totalItemCount;
        // 最后一个条目数 == 第一个可见+ 可见的总个数
        lastItemCount = firstVisibleItem + visibleItemCount;
    }

    public void setListener(ILoadListeer iLoadListeer){
        this.iLoadListeer = iLoadListeer;
    }

    // 加载完成
    public void loadComplete() {
        isLoading = false;
        ll_layout_bottom.setVisibility(View.GONE);
    }

    // 定义一个加载更多数据的接口
    public interface  ILoadListeer{
        public void onLoad();
    }
}
3.listview数据的展示
a.bean数据的展示
    public class ItemBean {
        private int imageView;
        private String title;
        private String content;

        public int getImageView() {
            return imageView;
        }

        public void setImageView(int imageView) {
            this.imageView = imageView;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }
b.adapter适配器
public class MyAdapter extends BaseAdapter {

    private List<ItemBean> list;
    private Context context;

    public MyAdapter(List<ItemBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = View.inflate(context, R.layout.list_item, null);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageview);
            viewHolder.content = (TextView) convertView.findViewById(R.id.text_content);
            viewHolder.title = (TextView) convertView.findViewById(R.id.text_title);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // 获取到数据对每一个控件进行赋值
        ItemBean itemBean = list.get(position);
        itemBean.setImageView(itemBean.getImageView());
        viewHolder.content.setText(itemBean.getContent());
        viewHolder.title.setText(itemBean.getTitle());

        return convertView;
    }

    public void onDataChanged(List<ItemBean> list) {
        this.list = list;
        this.notifyDataSetChanged();

    }


    class ViewHolder{
        private ImageView imageView;
        private TextView content;
        private TextView title;
    }
}

4.界面的展示

public class MainActivity extends AppCompatActivity implements LoadListview.ILoadListeer{

    private LoadListview listView;
    private List<ItemBean> list = new ArrayList<ItemBean>();
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (LoadListview) findViewById(R.id.listview);
        // 设置监听
        listView.setListener(this);
        initData();
        showData();
    }

    // 初始化数据
    private void initData() {
        for (int i = 0; i <10 ; i++) {
            ItemBean item = new ItemBean();
            item.setImageView(R.mipmap.ic_launcher);
            item.setContent("这是内容   " + i);
            item.setTitle("标题   " + i);
            list.add(item);
        }

    }

    // 显示数据
    private void showData() {
        if (adapter == null) {
            adapter = new MyAdapter(list, this);

            listView.setAdapter(adapter);
        } else {
            adapter.onDataChanged(list);
        }
    }

    @Override
    public void onLoad() {
        // 延迟两秒加载
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                getMoreData();
                showData();
                // 加载完毕
                listView.loadComplete();
            }
        }, 2500);

    }

    // 获取到更多的的数据
    private void getMoreData() {
        for (int i = 0; i <2 ; i++) {
            ItemBean item = new ItemBean();
            item.setImageView(R.mipmap.ic_launcher);
            item.setContent("这是内容----加载更多   " + i);
            item.setTitle("标题----加载更多   " + i);
            list.add(item);
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Android ListView 上拉加载更多的常用方法是使用下拉刷新框架,如 SwipeRefreshLayout 和 SmartRefreshLayout。这些框架提供了方便的 API 来实现下拉刷新和上拉加载更多。 这里提供一种基于 SmartRefreshLayout 的实现方法: 1. 在布局文件中添加 SmartRefreshLayout 和 ListView 组件: ``` <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.scwang.smartrefresh.layout.SmartRefreshLayout> ``` 2. 在 Activity 或 Fragment 中初始化 SmartRefreshLayout 和 ListView: ``` SmartRefreshLayout refreshLayout = findViewById(R.id.refreshLayout); ListView listView = findViewById(R.id.listView); // 设置下拉刷新监听器 refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull RefreshLayout refreshLayout) { // 下拉刷新操作 // 刷新完成后调用 refreshLayout.finishRefresh() 方法 } }); // 设置上拉加载更多监听器 refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(@NonNull RefreshLayout refreshLayout) { // 上拉加载更多操作 // 加载完成后调用 refreshLayout.finishLoadMore() 方法 } }); ``` 3. 当需要触发上拉加载更多时,调用 SmartRefreshLayout 的 `autoLoadMore()` 方法即可触发加载更多。 ``` refreshLayout.autoLoadMore(); ``` 在上面的代码中,你需要在上拉加载更多操作完成后手动调用 `refreshLayout.finishLoadMore()` 方法来通知 SmartRefreshLayout 完成加载更多操作。同样,在下拉刷新操作完成后,你也需要调用 `refreshLayout.finishRefresh()` 方法来通知 SmartRefreshLayout 完成下拉刷新操作。 总体来说,以上是一种基于 SmartRefreshLayout 的实现上拉加载更多的方法,你也可以使用其他类似框架来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值