之前写刷新数据的时候都会使用自定义的控件实现,现在Google给我们提供了更加方便的,刚写完,感觉还挺好看的,希望读到这篇文章的你能够喜欢。
SwipeRefreshLayout
简介
SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件。它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口。该Activity负责处理事件刷新和刷新相应的视图。一旦监听者接收到该事件,就决定了刷新过程中应处理的地方。如果要展示一个“刷新动画”,它必须调用setRefrshing(true),否则取消动画就调用setRefreshing(false)。
RecyclerView
简介
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。
废话不多说了,直接上代码:
activity_recycler.xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccccc"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl_title"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
android.support.v4.widget.SwipeRefreshLayout>
LinearLayout>
RecyclerActivity 的主界面
public class RecyclerActivity extends Activity {
private String TAG = "com.lv";
private int firstVisibleItem;
private int totalItemCount;
private boolean flag = false;
//屏幕中最后一个可见子项的position
private int lastVisibleItemPosition;
//声明 SwipeRefreshLayout
private SwipeRefreshLayout mSwipeRefreshLayout;
//声明 RecyclerView
private RecyclerView mRecyclerview;
//声明 LinearLayoutManager
private LinearLayoutManager mLayoutManager;
//声明 adapter
private SampleAdapter adapter;
//假数据
private List list;
//Handler 更新ui
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
for (int k = 0; k < 2; k++) {
ItemModel mitem = new ItemModel();
mitem.setTitle("用户服务型软件" + k);
mitem.setContent("新闻新闻新闻新闻新闻新闻新闻新闻新闻新闻");
list.add(mitem);
}
adapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler);
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_title);
mRecyclerview = (RecyclerView) findViewById(R.id.rv_list);
list = new ArrayList<>();
mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.color1),
getResources().getColor(R.color.color2), getResources().getColor(R.color.color3)
, getResources().getColor(R.color.color4));
// 这句话是为了,第一次进入页面的时候显示加载进度条
mSwipeRefreshLayout.setRefreshing(true);
mRecyclerview.addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItemPosition == (totalItemCount - 1)) {
Log.e(TAG, "1111");
mSwipeRefreshLayout.setRefreshing(true);
handler.sendEmptyMessageDelayed(0, 1000);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItemPosition = mLayoutManager.findLastVisibleItemPosition();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
totalItemCount = adapter.getItemCount();
if (firstVisibleItem + lastVisibleItemPosition == totalItemCount && !flag) {
flag = true;
} else {
flag = false;
}
}
});
for (int k = 0; k < 3; k++) {
ItemModel mitem = new ItemModel();
mitem.setTitle("新闻新闻" + k);
mitem.setContent("新闻新闻新闻新闻新闻新闻新闻新闻");
list.add(mitem);
}
mRecyclerview.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerview.setLayoutManager(mLayoutManager);
mRecyclerview.setItemAnimator(new DefaultItemAnimator());
adapter = new SampleAdapter(RecyclerActivity.this, list);
mRecyclerview.setAdapter(adapter);
handler.sendEmptyMessageDelayed(0, 1000);
}
}
adapter 的代码
/**
* Created by mac on 16/11/12.
*/
public class SampleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List list;
// enum Type{
// TYPE_ITEM ,TYPE_FOOTER
// }
private static final int TYPE_ITEM = 0;
private static final int TYPE_FOOTER = 1;
public SampleAdapter(Context context, List list) {
this.context = context;
this.list = list;
}
/**
* 创建
*
* @param parent
* @param viewType
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.list_item_text, null);
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT));
return new ItemViewHolder(view);
} else if (viewType == TYPE_FOOTER) {
// type == TYPE_FOOTER 返回footerView
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.footerview, null);
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT));
return new FooterViewHolder(view);
}
return null;
}
/**
* 绑定Viewholder 数据
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
((ItemViewHolder) holder).mtitle.setText(String.valueOf(list
.get(position).getTitle()));
((ItemViewHolder) holder).mcontent.setText(String.valueOf(list
.get(position).getContent()));
}
}
/**
* 每个item的类型
*
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// 最后一个item设置为footerView
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
/**
* 显示的item的数量
*
* @return
*/
@Override
public int getItemCount() {
return list.size() + 1;
}
/**
* 底部布局
*/
class FooterViewHolder extends RecyclerView.ViewHolder {
public FooterViewHolder(View view) {
super(view);
}
}
/**
* 每个Item 显示的内容
*/
class ItemViewHolder extends RecyclerView.ViewHolder {
TextView mtitle, mcontent;
public ItemViewHolder(View view) {
super(view);
mtitle = (TextView) view.findViewById(R.id.tv_title);
mcontent = (TextView) view.findViewById(R.id.tv_content);
}
}
}
list_item_text.xml 每个item的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/text_cirl"
android:orientation="horizontal"
android:padding="3dp">
<ImageView
android:id="@+id/iv_img"
android:layout_width="64dp"
android:layout_height="64dp"
android:padding="2dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:orientation="vertical"
android:padding="2dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:ellipsize="end"
android:lines="1"
android:textSize="18sp"
android:textStyle="bold"
tools:text="新闻的标题部分" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:ellipsize="end"
android:lines="1"
android:textSize="15sp"
android:textStyle="normal"
tools:text="新闻的主体内容部分新闻的主体内容部分新闻的主体内容部分新闻的主体内容部分" />
LinearLayout>
LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#cccc" /> LinearLayout>
另外我用的是android studio 2.2 所以在使用的时候在gradle中配置下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:recyclerview-v7:23.3.0'
testCompile 'junit:junit:4.12'
}
以上就是我弄的刷新数据,有兴趣的可以试试,这里面有隐藏的bug,大家可以自己发现,自己改动下吧!感兴趣的同学可以添加下我的微信 13792763023 我的微信号~ 欢迎大家一起讨论,共同成长~