ListView基本使用
2017-12-08 本文已影响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);
}