github上的地址:https://github.com/huxq17/XRefreshView;
简单的实现了下ListView,RecyclerView的上拉下拉:
首先依赖一下XRefresh的库:
上代码:
activity_main:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.zhihui.xrefreshview.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="48dp" android:text="listViewActivity" android:textAllCaps="false" android:onClick="listViewActivity"/> <Button android:layout_width="match_parent" android:layout_height="48dp" android:text="RecyclerViewActivity" android:textAllCaps="false" android:onClick="recyclerViewActivity"/> </LinearLayout>
MainActivity:
package com.zhihui.xrefreshview; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void listViewActivity(View view){ startActivity(new Intent(MainActivity.this,ListViewActivity.class)); } public void recyclerViewActivity(View view){ startActivity(new Intent(MainActivity.this,LinearRecyclerViewActivity.class)); } }
activity_list_view布局:
<com.andview.refreshview.XRefreshView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xrefreshview="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/custom_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" xrefreshview:isHeightMatchParent="true" xrefreshview:isWidthMatchParent="true" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.andview.refreshview.XRefreshView>
package com.zhihui.xrefreshview; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.andview.refreshview.XRefreshView; import com.andview.refreshview.utils.LogUtils; import java.util.ArrayList; import java.util.List; public class ListViewActivity extends AppCompatActivity { private ListView lv; private List<String> str_name = new ArrayList<String>(); private XRefreshView refreshView; private ArrayAdapter<String> adapter; public static long lastRefreshTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view); for (int i = 0; i <14; i++) { str_name.add("数据" + i); } lv = (ListView) findViewById(R.id.lv); refreshView = (XRefreshView) findViewById(R.id.custom_view); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str_name); lv.setAdapter(adapter); // 设置是否可以下拉刷新 refreshView.setPullRefreshEnable(true); // 设置是否可以上拉加载 refreshView.setPullLoadEnable(true); // 设置上次刷新的时间 refreshView.restoreLastRefreshTime(lastRefreshTime); //当下拉刷新被禁用时,调用这个方法并传入false可以不让头部被下拉 refreshView.setMoveHeadWhenDisablePullRefresh(true); // 设置时候可以自动刷新 refreshView.setAutoRefresh(false); // refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { // @Override // public boolean isBottom() { // return false; // } // }); refreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { @Override public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { refreshView.stopRefresh(); lastRefreshTime = refreshView.getLastRefreshTime(); } }, 2000); } @Override public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { @Override public void run() { refreshView.stopLoadMore(); } }, 2000); } @Override public void onRelease(float direction) { super.onRelease(direction); if (direction > 0) { toast("下拉"); } else { toast("上拉"); } } }); refreshView.setOnAbsListViewScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { LogUtils.i("onScrollStateChanged"); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { LogUtils.i("onScroll"); } }); } public void toast(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } }
activity_linear_recycler_view布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.andview.refreshview.XRefreshView android:id="@+id/xrefreshview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_test_rv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="2dp" android:background="#bbccaa" android:scrollbars="vertical" /> </com.andview.refreshview.XRefreshView> </RelativeLayout>
package com.zhihui.xrefreshview; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.andview.refreshview.XRefreshView; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; public class LinearRecyclerViewActivity extends AppCompatActivity { @Bind(R.id.recycler_view_test_rv) RecyclerView recyclerView; @Bind(R.id.xrefreshview) XRefreshView xRefreshView; private List<String> listData; private MyAdapter adapter; LinearLayoutManager layoutManager; private int mLoadCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_linear_recycler_view); ButterKnife.bind(this); recyclerView.setHasFixedSize(true); initData(); adapter=new MyAdapter(this,listData); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 静默加载模式不能设置footerview recyclerView.setAdapter(adapter); //设置刷新完成以后,headerview固定的时间 xRefreshView.setPinnedTime(1000); // xRefreshView.setMoveForHorizontal(true); xRefreshView.setPullLoadEnable(true); xRefreshView.setAutoLoadMore(false); // adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); xRefreshView.enableReleaseToLoadMore(true); xRefreshView.enableRecyclerViewPullUp(true); xRefreshView.enablePullUpWhenLoadCompleted(true); xRefreshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() { @Override public void onRefresh(boolean isPullDown) { new Handler().postDelayed(new Runnable() { @Override public void run() { xRefreshView.stopRefresh(); } }, 500); } @Override public void onLoadMore(boolean isSilence) { new Handler().postDelayed(new Runnable() { public void run() { mLoadCount++; if (mLoadCount >= 3) {//模拟没有更多数据的情况 xRefreshView.setLoadComplete(true); } else { // 刷新完成必须调用此方法停止加载 xRefreshView.stopLoadMore(false); //当数据加载失败 不需要隐藏footerview时,可以调用以下方法,传入false,不传默认为true } } }, 1000); } }); } private void initData() { listData = new ArrayList<>(); for (int i = 0; i < 15; i++) { listData.add("我是第" + i + "个item"); } } }
recycler_view布局:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="100dp" xmlns:card_view="http://schemas.android.com/tools" android:layout_gravity="center" android:foreground="?android:attr/selectableItemBackground" card_view:cardBackgroundColor="@android:color/white" card_view:cardCornerRadius="8dp" android:layout_margin="5dp" android:paddingBottom="5dp" card_view:cardElevation="4dp"> <LinearLayout android:id="@+id/recycler_view_test_item_person_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="15dp"> <TextView android:id="@+id/item_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout> </android.support.v7.widget.CardView>
package com.zhihui.xrefreshview; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2017/6/16. */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private Context context; private List<String> datas; public MyAdapter(Context context, List<String> datas) { this.context = context; this.datas = datas; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate( R.layout.recycler_item, parent, false); return new MyViewHolder(v); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv.setText(datas.get(position)); } @Override public int getItemCount() { return datas.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private final TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.item_tv); } } }