思路:
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);
}
}
}