在google的android.support.v4包中,提供一个SwipeRefreshLayout方法, 用于实现下拉刷新。
在主布局中的文件:加入以下代码:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/layout_swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
在Activity中
实现以下核心代码:
SwipeRefreshLayout.OnRefreshListener, 并且在这个口里面提供了一个抽象方法:onRefresh(), 到这里, 我们大概知道它是怎么运作的了,我们只需要在Activity中,实现这个接口,并且实现OnRefresh()方法即可,在onReflesh()方法中,进行我们的刷新数据操作
public class Fragment1 extends Fragment {
int isXx=0;
private RecyclerView rv;
ArrayList<String> list=new ArrayList<>();
private MyAdapter md;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==1){
sw.setRefreshing(false);
md.RemoveView(0);
}
if (msg.what==0){
md.addMoreItem(newDatas);
md.Abb2();
isXx=0;
}
}
};
private SwipeRefreshLayout sw;
private List<String> newDatas;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment1, null);
rv = (RecyclerView) v.findViewById(R.id.rv);
sw = (SwipeRefreshLayout) v.findViewById(R.id.sw);
//设置刷新时动画的颜色,可以设置4个
sw.setProgressBackgroundColorSchemeResource(android.R.color.white);
sw.setColorSchemeResources(android.R.color.holo_blue_light,
android.R.color.holo_red_light,android.R.color.holo_orange_light,
android.R.color.holo_green_light);
sw.setProgressViewOffset(false, 0, (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources()
.getDisplayMetrics()));
sw.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//数据重新加载完成后,提示数据发生改变,并且设置现在不在刷新
md.addItem("刷新了");
sw.setRefreshing(true);
handler.sendEmptyMessageDelayed(1,2000);
}
});
rv.setOnScrollListener(new RecyclerView.OnScrollListener() {
private int lastVisibleItemPosition;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (isXx==0&&newState ==RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition+1==md.getItemCount()) {
isXx=1;
newDatas = new ArrayList<String>();
for (int i = 0; i < 4; i++) {
int index = i + 1;
newDatas.add("more item" + index);
}
md.Abb();
handler.sendEmptyMessageDelayed(0, 2000);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView,dx, dy);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
}
});
for (int i = 0; i < 4; i++) {
list.add("a"+i);
}
/*rv.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL) );*/
rv.setLayoutManager(new LinearLayoutManager(getActivity()));
rv.setItemAnimator(new DefaultItemAnimator());
md = new MyAdapter(getActivity(),list);
rv.setAdapter(md);
md.setOnItemClickListener(new MyAdapter.onItemClickListerner() {
@Override
public void onItemClick(View view, int position) {
md.AddView(position);
}
@Override
public void onLongItemClick(View view, int position) {
md.RemoveView(position);
}
});
return v;
}
}
适配器代码:public class MyAdapter extends
RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<String> list = new ArrayList<String>();
private List<Integer> mHeights;
Context context;
private onItemClickListerner listener;
private MyViewHolder2 h2;
public MyAdapter(Context ctx, ArrayList<String> list) {
this.context = ctx;
this.list = list;
mHeights = new ArrayList<Integer>();
for (int i = 0; i < list.size(); i++) {
mHeights.add((int) (150 + Math.random() * 300));
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
context).inflate(R.layout.listitme, parent,
false));
return holder;
} else if (viewType == 0) {
MyViewHolder2 holder2 = new MyViewHolder2(LayoutInflater.from(
context).inflate(R.layout.listitem2, parent,
false));
return holder2;
}
return null;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MyViewHolder) {
/*ViewGroup.LayoutParams lp=holder.tv.getLayoutParams();
lp.height=mHeights.get(position);
holder.tv.setLayoutParams(lp);*/
final MyViewHolder h = (MyViewHolder) holder;
h.tv.setText(list.get(position));
if (listener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = h.getAdapterPosition();
listener.onItemClick(h.itemView, pos);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = h.getAdapterPosition();
listener.onLongItemClick(h.itemView, pos);
return false;
}
});
}
} else if (holder instanceof MyViewHolder2){
h2 = (MyViewHolder2) holder;
}
}
@Override
public int getItemCount() {
return list.size() + 1;
}
@Override
public int getItemViewType(int position) {
// 最后一个item设置为footerView
if (position + 1 == getItemCount()) {
return 0;
} else {
return 1;
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.tv);
}
}
class MyViewHolder2 extends RecyclerView.ViewHolder {
ProgressBar tvv;
public MyViewHolder2(View view) {
super(view);
tvv = (ProgressBar) view.findViewById(R.id.bar);
}
}
public interface onItemClickListerner {
void onItemClick(View view, int position);
void onLongItemClick(View view, int position);
}
public void setOnItemClickListener(onItemClickListerner listener) {
this.listener = listener;
}
public void RemoveView(int position) {
list.remove(position);
notifyItemRemoved(position);
}
public void AddView(int position) {
list.add("b" + position);
notifyItemInserted(position);
}
//添加数据
public void addItem(String newDatas) {
list.add(0, newDatas);
notifyDataSetChanged();
}
public void addMoreItem(List<String> newDatas) {
list.addAll(newDatas);
notifyDataSetChanged();
}
public void Abb(){
h2.tvv.setVisibility(View.VISIBLE);
}
public void Abb2(){
h2.tvv.setVisibility(View.GONE);
}
}
参考网址:http://blog.youkuaiyun.com/developer_jiangqq/article/details/49992269