配置:
implementation project(':xlibs') compile 'com.android.support:design:26+' compile 'com.android.support:recyclerview-v7:26+' compile 'com.facebook.fresco:fresco:0.7.0' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' compile 'com.dalu9527:TextWave:0.0.2'xlibs怕麻烦,百度网盘下载:https://pan.baidu.com/s/1h7h15QrI4svdkZv6xcTIuQ
出现错误,参考:https://blog.csdn.net/u014095878/article/details/80117686
先写布局文件:
activity_main.xml
<com.xlibs.xrv.view.XRecyclerView android:id="@+id/xrecyclerview" android:layout_width="match_parent" android:layout_height="match_parent"></com.xlibs.xrv.view.XRecyclerView>
custom_header_view.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wave="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="51dp" android:orientation="horizontal" android:gravity="center"> <com.wave.library.view.WaveTextView android:id="@+id/waveTextView" android:layout_width="200dp" android:layout_height="50dp" wave:textColor="@color/colorAccent" wave:textSize="17sp" wave:waveSpeed="1" wave:waveAmplitudes="20" wave:text="Hello World" wave:autoStart="true" android:gravity="center"/> </LinearLayout>
footer_view.xml
<?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="50dp" android:orientation="horizontal" android:background="#fff" android:gravity="center"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Small"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="正在加载..."/> </LinearLayout>
header_view.xml
<?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="50dp" android:orientation="horizontal" android:background="#fff" android:gravity="center"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Small"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:textSize="20dp" android:text="正在刷新..."/> </LinearLayout>
item_2_image_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="150dp" android:orientation="vertical" android:background="#ffffff"> <LinearLayout android:id="@+id/linearlayout_image" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/image2_1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:scaleType="fitXY"/> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/image2_2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:scaleType="fitXY"/> </LinearLayout> </LinearLayout>
正文:
public class MyApplication extends Application { private static final String TAG = "MyApplication"; @Override public void onCreate() { super.onCreate(); initFresco(); // initLeakCanary(); } /** * 初始化LeakCanary */ // private void initLeakCanary() { // LeakCanary.install(this); // } /** * 初始化Fresco */ private void initFresco() { Fresco.initialize(this); } }继承Application,不要忘记权限中+name
adapter
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<List<String>> mUrl = new ArrayList<>(); public MyAdapter(List<List<String>> data) { mUrl = data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_2_image_layout, parent, false); return new ImageViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ImageViewHolder) { if(mUrl.size() != 0){ ((ImageViewHolder) holder).setData(mUrl.get(position)); } } } @Override public int getItemCount() { return mUrl.size(); } }
MainActivity.java
public class MainActivity extends AppCompatActivity { private final static String TAG = "MainActivity"; private XRecyclerView mXRecyclerView; private View mHeaderView; private View mFooterView; private MyAdapter mMyAdapter; private List<List<String>> mLists = new ArrayList<>(); private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); XLinearLayoutManager xLinearLayoutManager = new XLinearLayoutManager(this); XGridLayoutManager xGridLayoutManager = new XGridLayoutManager(this, 2); XStaggeredGridLayoutManager xStaggeredGridLayoutManager = new XStaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mXRecyclerView.setLayoutManager(xLinearLayoutManager); // 添加下拉刷新的头部 和 加载更多的底部,如果不加,默认含有下拉刷新的头部,而没有加载更多的底部 mHeaderView = LayoutInflater.from(this).inflate(R.layout.custom_header_view, null); mFooterView = LayoutInflater.from(this).inflate(R.layout.footer_view, null); mXRecyclerView.addHeaderView(mHeaderView, 50); mXRecyclerView.addFootView(mFooterView, 50); // 设置adapter mMyAdapter = new MyAdapter(mLists); mXRecyclerView.setAdapter(mMyAdapter); // 添加下拉刷新 mXRecyclerView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { refreshData(); } }); // 加载更多(如果没有添加加载更多的布局,下面那LoadMore不会执行) mXRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore() { loadMoreData(); } }); // mXRecyclerView.setEnableRefreshAndLoadMore(false); // mXRecyclerView.setRefresh(false); } /** * refresh */ private void refreshData() { new Handler().postDelayed(new Runnable() { @Override public void run() { initRefreshData(); mXRecyclerView.refreshComplate(); } }, 2000); } /** * init refrsh data */ private void initRefreshData() { for (int i = 0; i < 1; i++) { List<String> url = new ArrayList<>(); url.add("http://qq1234.org/uploads/allimg/140404/3_140404114606_1.jpg"); url.add("http://qq1234.org/uploads/allimg/140404/3_140404114555_6.jpg"); mLists.add(url); } } private void initView() { mXRecyclerView = (XRecyclerView) findViewById(R.id.xrecyclerview); } /** * load more */ private void loadMoreData() { new Handler().postDelayed(new Runnable() { @Override public void run() { initLoadMoreData(); mXRecyclerView.loadMoreComplate(); } }, 2000); } /** * init Load More Data */ private void initLoadMoreData() { for (int i = 0; i < 2; i++) { List<String> url = new ArrayList<>(); url.add("http://qq1234.org/uploads/allimg/140404/3_140404114555_5.jpg"); url.add("http://qq1234.org/uploads/allimg/140404/3_140404114555_4.jpg"); mLists.add(url); } } @Override protected void onDestroy() { super.onDestroy(); mXRecyclerView.destroyHandler(); } }
最重要的2部分,按理说要最早写的
public class BaseViewHolder<T> extends RecyclerView.ViewHolder { public BaseViewHolder(View itemView) { super(itemView); } /** * data * @param data */ public void setData(List<T> data){} }
public class ImageViewHolder extends BaseViewHolder<String>{ private static final String TAG = "ImageViewHolder"; private LinearLayout mLayout; private SimpleDraweeView mImage_1; private SimpleDraweeView mImage_2; public ImageViewHolder(View itemView) { super(itemView); mLayout = (LinearLayout)itemView.findViewById(R.id.layout); mImage_1 = (SimpleDraweeView)itemView.findViewById(R.id.image2_1); mImage_2 = (SimpleDraweeView)itemView.findViewById(R.id.image2_2); } @Override public void setData(List<String> data) { super.setData(data); mImage_1.setImageURI(Uri.parse(data.get(0))); mImage_2.setImageURI(Uri.parse(data.get(1))); mImage_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG,"click left"); } }); mImage_2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG,"click right"); } }); } }
最后加一个联网权限