activityList;
25 | private String[] activityTitle = {"RecyclerView 滚动定位", "水平调整布局", "垂直调整布局","Listview对比测试","自定义View测试","GooglePlay Demo","显示隐藏","点击事件性能优化","网格处理计算器布局","局部刷新","旋转自定义测试"};
26 | private Class>[] ACTIVITY = {RecyclerClickItemActivity.class, HorizontalAdjustActivity.class, VerticalAdjustActivity.class,ListActivity.class,CustomView.class,GooglePlayActivity.class,HideActivity.class,OptimizeItemClickActivity.class,OptimizeItem2ClickActivity.class,LocalRefreshActivity.class,RotateActivity.class
27 | };
28 |
29 | @Override
30 | protected void onCreate(Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | super.setContentView(R.layout.activity_main);
33 | initData();
34 | initView();
35 | initAdapter();
36 | recyclerview.setAdapter(homeAdapter);
37 | recyclerview.setLayoutManager(layoutManager);
38 | // recyclerview.addOnItemTouchListener(new OnItemClickListener() {
39 | // @Override
40 | // public void onSimpleItemClick(final BaseQuickAdapter baseQuickAdapter, final View view, final int position) {
41 | // Intent intent = new Intent(MainActivity.this, ACTIVITY[position]);
42 | // startActivity(intent);
43 | // }
44 | // });
45 | homeAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
46 | @Override
47 | public void onItemClick(BaseQuickAdapter baseQuickAdapter, View view, int position) {
48 | Intent intent = new Intent(MainActivity.this, ACTIVITY[position]);
49 | startActivity(intent);
50 | }
51 | });
52 | }
53 |
54 | private void initData() {
55 | activityList = new ArrayList<>();
56 | for (int i = 0; i < activityTitle.length; i++) {
57 | Home home = new Home(activityTitle[i]);
58 | activityList.add(home);
59 | }
60 |
61 |
62 | }
63 |
64 | private void initAdapter() {
65 | homeAdapter = new HomeAdapter(activityList);
66 | layoutManager = new LinearLayoutManager(this);
67 | layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
68 |
69 | }
70 |
71 | private void initView() {
72 | recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
73 | activityMain = (RelativeLayout) findViewById(R.id.activity_main);
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/OptimizeItem2ClickActivity.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.design.widget.FloatingActionButton;
5 | import android.support.design.widget.Snackbar;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.GridLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.support.v7.widget.Toolbar;
10 | import android.view.View;
11 | import android.widget.Toast;
12 |
13 | import com.allen.recyclerview.R;
14 | import com.allen.recyclerview.adapter.OptimeizeClickAdapter;
15 | import com.chad.library.adapter.base.BaseQuickAdapter;
16 |
17 | public class OptimizeItem2ClickActivity extends AppCompatActivity {
18 | private RecyclerView mRecyclerView;
19 | private OptimeizeClickAdapter mQuickAdapter;
20 | private static final int PAGE_SIZE = 100;
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.activity_optimize_item_click);
25 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
26 | setSupportActionBar(toolbar);
27 |
28 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
29 | fab.setOnClickListener(new View.OnClickListener() {
30 | @Override
31 | public void onClick(View view) {
32 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
33 | .setAction("Action", null).show();
34 | }
35 | });
36 | mRecyclerView = (RecyclerView) findViewById(R.id.list);
37 | GridLayoutManager layoutManager = new GridLayoutManager(this,4);
38 | mRecyclerView.setLayoutManager(layoutManager);
39 | initAdapter();
40 |
41 | // /**
42 | // * Item clcik
43 | // */
44 | //
45 | // mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
46 | //
47 | // @Override
48 | // public void onSimpleItemClick(BaseQuickAdapter adapter, View view, int position) {
49 | // }
50 | //
51 | // @Override
52 | // public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
53 | // Logger.d("当前时间 "+System.currentTimeMillis());
54 | // super.onItemChildClick(adapter, view, position);
55 | // switch (view.getId()) {
56 | //
57 | // default:
58 | // break;
59 | // }
60 | // }
61 | //
62 | //
63 | // @Override
64 | // public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
65 | // super.onItemLongClick(adapter, view, position);
66 | //
67 | // }
68 | //
69 | // @Override
70 | // public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
71 | // super.onItemChildLongClick(adapter, view, position);
72 | //
73 | // }
74 | // });
75 | }
76 |
77 | private void initAdapter() {
78 | mQuickAdapter = new OptimeizeClickAdapter(PAGE_SIZE);
79 | mQuickAdapter.openLoadAnimation();
80 | mQuickAdapter.notifyItemChanged(1,1);
81 | mRecyclerView.setAdapter(mQuickAdapter);
82 | mQuickAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
83 | @Override
84 | public void onItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
85 | Toast.makeText(OptimizeItem2ClickActivity.this,"onItemClick",Toast.LENGTH_SHORT).show();
86 | }
87 | });
88 | mQuickAdapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
89 | @Override
90 | public boolean onItemLongClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
91 | Toast.makeText(OptimizeItem2ClickActivity.this,"onItemLongClick",Toast.LENGTH_SHORT).show();
92 | return true;
93 | }
94 | });
95 | mQuickAdapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() {
96 | @Override
97 | public boolean onItemChildLongClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
98 | Toast.makeText(OptimizeItem2ClickActivity.this,"onItemChildLongClick",Toast.LENGTH_SHORT).show();
99 | return true;
100 | }
101 | });
102 | mQuickAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
103 | @Override
104 | public void onItemChildClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
105 | Toast.makeText(OptimizeItem2ClickActivity.this,"onItemChildClick",Toast.LENGTH_SHORT).show();
106 | }
107 | });
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/OptimizeItemClickActivity.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.design.widget.FloatingActionButton;
5 | import android.support.design.widget.Snackbar;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.support.v7.widget.Toolbar;
10 | import android.view.View;
11 |
12 | import com.allen.recyclerview.R;
13 | import com.allen.recyclerview.adapter.OptimeizeClickAdapter;
14 | import com.chad.library.adapter.base.BaseQuickAdapter;
15 | import com.chad.library.adapter.base.listener.OnItemClickListener;
16 | import com.orhanobut.logger.Logger;
17 |
18 | public class OptimizeItemClickActivity extends AppCompatActivity {
19 | private RecyclerView mRecyclerView;
20 | private OptimeizeClickAdapter mQuickAdapter;
21 | private static final int PAGE_SIZE = 100;
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_optimize_item_click);
26 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
27 | setSupportActionBar(toolbar);
28 |
29 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
30 | fab.setOnClickListener(new View.OnClickListener() {
31 | @Override
32 | public void onClick(View view) {
33 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
34 | .setAction("Action", null).show();
35 | }
36 | });
37 | mRecyclerView = (RecyclerView) findViewById(R.id.list);
38 | LinearLayoutManager layoutManager = new LinearLayoutManager(this);
39 | mRecyclerView.setLayoutManager(layoutManager);
40 | initAdapter();
41 |
42 | // /**
43 | // * Item clcik
44 | // */
45 | //
46 | mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
47 |
48 | @Override
49 | public void onSimpleItemClick(BaseQuickAdapter adapter, View view, int position) {
50 | }
51 |
52 | @Override
53 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
54 | Logger.d("当前时间 "+System.currentTimeMillis());
55 | super.onItemChildClick(adapter, view, position);
56 | switch (view.getId()) {
57 |
58 | default:
59 | break;
60 | }
61 | }
62 |
63 |
64 | @Override
65 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
66 | super.onItemLongClick(adapter, view, position);
67 |
68 | }
69 |
70 | @Override
71 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
72 | super.onItemChildLongClick(adapter, view, position);
73 |
74 | }
75 | });
76 | }
77 |
78 | private void initAdapter() {
79 | mQuickAdapter = new OptimeizeClickAdapter(PAGE_SIZE);
80 | mQuickAdapter.openLoadAnimation();
81 | mRecyclerView.setAdapter(mQuickAdapter);
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/RecyclerClickItemActivity.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.activity;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.LinearLayoutManager;
6 | import android.support.v7.widget.RecyclerView;
7 | import android.text.TextUtils;
8 | import android.view.MotionEvent;
9 | import android.view.View;
10 | import android.widget.Button;
11 | import android.widget.EditText;
12 | import android.widget.Toast;
13 |
14 | import com.allen.recyclerview.R;
15 | import com.allen.recyclerview.adapter.QuickClickAdapter;
16 | import com.chad.library.adapter.base.BaseQuickAdapter;
17 | import com.chad.library.adapter.base.listener.OnItemClickListener;
18 |
19 | /**
20 | * create by AllenCoder
21 | */
22 | public class RecyclerClickItemActivity extends Activity {
23 |
24 | private RecyclerView mRecyclerView;
25 | private QuickClickAdapter mQuickAdapter;
26 | private static final int PAGE_SIZE = 100;
27 | private static String TAG = "RecyclerClickItemActivity";
28 | private EditText etnum;
29 | private Button btnGo;
30 | private LinearLayoutManager layoutManager;
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | setContentView(R.layout.activity_recycler_click);
35 | this.btnGo = (Button) findViewById(R.id.btn_go);
36 | this.etnum = (EditText) findViewById(R.id.et_num);
37 | mRecyclerView = (RecyclerView) findViewById(R.id.list);
38 | layoutManager = new LinearLayoutManager(this);
39 | mRecyclerView.setLayoutManager(layoutManager);
40 | initAdapter();
41 |
42 | // /**
43 | // * Item clcik
44 | // */
45 | //
46 | mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
47 |
48 | @Override
49 | public void onSimpleItemClick(BaseQuickAdapter adapter, View view, int position) {
50 | Toast.makeText(RecyclerClickItemActivity.this, "" + Integer.toString(position), Toast.LENGTH_SHORT).show();
51 | }
52 |
53 | @Override
54 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
55 | super.onItemChildClick(adapter, view, position);
56 | switch (view.getId()) {
57 | case R.id.tweetAvatar:
58 | Toast.makeText(RecyclerClickItemActivity.this, "The " + Integer.toString(position)+" tweetAvatar is clicked", Toast.LENGTH_SHORT).show();
59 | break;
60 | case R.id.tweetName:
61 | Toast.makeText(RecyclerClickItemActivity.this, "The " + Integer.toString(position)+" tweetName is clicked", Toast.LENGTH_SHORT).show();
62 | break;
63 | default:
64 | break;
65 | }
66 | }
67 |
68 |
69 | @Override
70 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
71 | super.onItemLongClick(adapter, view, position);
72 | Toast.makeText(RecyclerClickItemActivity.this,"The " + Integer.toString(position)+ " Item is LongClick ", Toast.LENGTH_SHORT).show();
73 |
74 | }
75 |
76 | @Override
77 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
78 | super.onItemChildLongClick(adapter, view, position);
79 | Toast.makeText(RecyclerClickItemActivity.this, "The "+ Integer.toString(position)+" view itemchild " + "is LongClick " + Integer.toString(position), Toast.LENGTH_SHORT).show();
80 |
81 | }
82 | });
83 | btnGo.setOnClickListener(new View.OnClickListener() {
84 | @Override
85 | public void onClick(final View v) {
86 | if (!TextUtils.isEmpty(etnum.getText().toString())){
87 | layoutManager.scrollToPositionWithOffset(Integer.valueOf(etnum.getText().toString()),0);
88 | layoutManager.setStackFromEnd(true);
89 | }
90 | }
91 | });
92 | }
93 |
94 |
95 | private void initAdapter() {
96 | mQuickAdapter = new QuickClickAdapter(PAGE_SIZE);
97 | mQuickAdapter.openLoadAnimation();
98 | mRecyclerView.setAdapter(mQuickAdapter);
99 | }
100 |
101 |
102 | @Override
103 | public boolean dispatchTouchEvent(MotionEvent ev) {
104 | return super.dispatchTouchEvent(ev);
105 | }
106 |
107 | }
108 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/RotateActivity.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.activity;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ValueAnimator;
5 | import android.graphics.Path;
6 | import android.graphics.PathMeasure;
7 | import android.graphics.PixelFormat;
8 | import android.graphics.RectF;
9 | import android.os.Bundle;
10 | import android.support.v7.app.AppCompatActivity;
11 | import android.view.Gravity;
12 | import android.view.View;
13 | import android.view.WindowManager;
14 | import android.widget.ImageView;
15 |
16 | import com.allen.recyclerview.R;
17 |
18 | public class RotateActivity extends AppCompatActivity implements View.OnClickListener {
19 |
20 | private ImageView mImageView;
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_rotate);
26 | initView();
27 | }
28 |
29 | private void initView() {
30 | mImageView = (ImageView) findViewById(R.id.imageView);
31 | mImageView.setOnClickListener(this);
32 | }
33 |
34 | @Override
35 | public void onClick(View v) {
36 | switch (v.getId()) {
37 | case R.id.imageView:
38 | final ImageView moveImg = new ImageView(this);
39 | moveImg.setImageResource(R.mipmap.ic_launcher);
40 | ImageView imageView = (ImageView) v;
41 | WindowManager wm = getWindowManager();
42 | final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_TOAST);
43 | lp.width = imageView.getWidth();
44 | lp.height = imageView.getHeight();
45 | lp.format = PixelFormat.TRANSLUCENT;
46 | lp.gravity = Gravity.LEFT | Gravity.TOP;
47 | int fromX = (int) moveImg.getX();
48 | int fromY = (int) moveImg.getY();
49 | lp.x = fromX;
50 | lp.y = fromY - imageView.getHeight();
51 |
52 | imageView.setPivotX(lp.width / 2);
53 | imageView.setPivotY(lp.height / 2);
54 |
55 | try {
56 | wm.addView(moveImg, lp);
57 | } catch (Exception e) {
58 | return;
59 | }
60 |
61 | Path path = getAnimMovePath(v.getX(),v.getY(),100,100);
62 | final PathMeasure pm = new PathMeasure(path, false);
63 |
64 | final float totalLen = pm.getLength();
65 | ValueAnimator animator = ValueAnimator.ofFloat(0, totalLen)
66 | .setDuration(2000);
67 | animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
68 | @Override
69 | public void onAnimationUpdate(ValueAnimator animation) {
70 | float curLen = (float) animation.getAnimatedValue();
71 |
72 | moveImg.setRotation(3000 * (1 - curLen / totalLen));
73 |
74 | float[] curPos = new float[2];
75 | pm.getPosTan(curLen, curPos, null);
76 | lp.x = (int) curPos[0];
77 | lp.y = (int) curPos[1];
78 |
79 | getWindowManager().updateViewLayout(moveImg, lp);
80 | }
81 | });
82 | animator.addListener(new Animator.AnimatorListener() {
83 | @Override
84 | public void onAnimationStart(Animator animation) {
85 |
86 | }
87 |
88 | @Override
89 | public void onAnimationEnd(Animator animation) {
90 | try {
91 | getWindowManager().removeView(moveImg);
92 | } catch (Exception e) {
93 | // null
94 | }
95 | }
96 |
97 | @Override
98 | public void onAnimationCancel(Animator animation) {
99 | onAnimationEnd(animation);
100 | }
101 |
102 | @Override
103 | public void onAnimationRepeat(Animator animation) {
104 |
105 | }
106 |
107 | });
108 | animator.start();
109 | break;
110 | }
111 | }
112 | /**
113 | * 根据开始和结束点获取移动路径
114 | *
115 | * 让起点和终点落在一个圆上,取起点和终点所在一段圆弧作为路径!
116 | *
117 | * @return 移动路径
118 | */
119 | private Path getAnimMovePath(float x1, float y1, int x2, int y2) {
120 | Path path = new Path();
121 |
122 | // 起点和结束点中点
123 | float x0 = (x1 + x2) / 2f;
124 | float y0 = (y1 + y2) / 2f;
125 | // 圆半径,暂定为两点距离
126 | int r = (int) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
127 | // 起点和结束点连线的垂线斜率
128 | float k = -(float) (x1 - x2) / (y1 - y2);
129 |
130 | // 根据下边公式求圆心
131 | // cy = y0 + k * (cx - x0);
132 | // (cy - y0)^2 + (cx - x0)^2 + (r / 2)^2= r^2
133 | float cx0 = (float) (x0 + Math.sqrt(3) / 2 * r / Math.sqrt(k * k + 1)); // 第一个圆心X坐标
134 | float cx1 = (float) (x0 - Math.sqrt(3) / 2 * r / Math.sqrt(k * k + 1)); // 第二个圆心X坐标
135 |
136 | float cx = k < 0 ? cx1 : cx0;
137 | float cy = y0 + k * (cx - x0);
138 |
139 | float startAngle = (float) Math.toDegrees(Math.atan((y1 - cy) / (x1 - cx)));
140 | float toAngle = (float) Math.toDegrees(Math.atan((y2 - cy) / (x2 - cx)));
141 |
142 | if (k < 0) {
143 | startAngle += 360;
144 | toAngle += 360;
145 |
146 | if (toAngle > startAngle) {
147 | toAngle -= 180;
148 | }
149 | } else {
150 | startAngle += 180;
151 | toAngle += 180;
152 | }
153 |
154 | RectF rectF = new RectF(cx - r, cy - r, cx + r, cy + r);
155 | path.addArc(rectF, startAngle, toAngle - startAngle);
156 | return path;
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/TestActivity.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.view.MotionEvent;
6 |
7 | import com.allen.recyclerview.R;
8 | import com.allen.recyclerview.view.ScrollByView;
9 |
10 | public class TestActivity extends AppCompatActivity {
11 |
12 | ScrollByView mScrollView;
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.activity_test);
18 | mScrollView = (ScrollByView) findViewById(R.id.scrollView);
19 |
20 | }
21 |
22 | @Override
23 | public boolean onTouchEvent(MotionEvent event) {
24 | mScrollView.onTouchEvent(event);
25 | return super.onTouchEvent(event);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/activity/VerticalAdjustActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.activity;
16 |
17 | import android.app.Activity;
18 | import android.os.Bundle;
19 | import android.support.v7.widget.LinearLayoutManager;
20 | import android.support.v7.widget.RecyclerView;
21 | import android.text.TextUtils;
22 | import android.view.MotionEvent;
23 | import android.view.View;
24 | import android.widget.Button;
25 | import android.widget.EditText;
26 | import android.widget.Toast;
27 |
28 | import com.allen.recyclerview.R;
29 | import com.allen.recyclerview.adapter.QuickClickAdapter;
30 | import com.chad.library.adapter.base.BaseQuickAdapter;
31 | import com.chad.library.adapter.base.listener.OnItemClickListener;
32 |
33 | /**
34 | * 文 件 名: VerticalAdjustActivity
35 | * 创 建 人: Allen
36 | * 创建日期: 16/10/29 13:28
37 | * 邮 箱: AllenCoder@126.com
38 | * 修改时间:
39 | * 修改备注:
40 | */
41 | public class VerticalAdjustActivity extends Activity {
42 | private RecyclerView mRecyclerView;
43 | private QuickClickAdapter mQuickAdapter;
44 | private static final int PAGE_SIZE = 100;
45 | private static String TAG = "RecyclerClickItemActivity";
46 | private EditText etnum;
47 | private Button btnGo;
48 | private LinearLayoutManager layoutManager;
49 |
50 | @Override
51 | protected void onCreate(Bundle savedInstanceState) {
52 | super.onCreate(savedInstanceState);
53 | setContentView(R.layout.activity_recycler_click);
54 | this.btnGo = (Button) findViewById(R.id.btn_go);
55 | this.etnum = (EditText) findViewById(R.id.et_num);
56 | mRecyclerView = (RecyclerView) findViewById(R.id.list);
57 | layoutManager = new LinearLayoutManager(this);
58 | mRecyclerView.setLayoutManager(layoutManager);
59 | initAdapter();
60 |
61 | // /**
62 | // * Item clcik
63 | // */
64 | //
65 | mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
66 |
67 | @Override
68 | public void onSimpleItemClick(BaseQuickAdapter adapter, View view, int position) {
69 | Toast.makeText(VerticalAdjustActivity.this, "" + Integer.toString(position), Toast.LENGTH_SHORT).show();
70 | }
71 |
72 |
73 | });
74 | btnGo.setOnClickListener(new View.OnClickListener() {
75 | @Override
76 | public void onClick(final View v) {
77 | if (!TextUtils.isEmpty(etnum.getText().toString())) {
78 | layoutManager.scrollToPositionWithOffset(Integer.valueOf(etnum.getText().toString()), 0);
79 | layoutManager.setStackFromEnd(true);
80 | }
81 | }
82 | });
83 | }
84 |
85 |
86 | private void initAdapter() {
87 | mQuickAdapter = new QuickClickAdapter(PAGE_SIZE);
88 | mQuickAdapter.openLoadAnimation();
89 | mRecyclerView.setAdapter(mQuickAdapter);
90 | }
91 |
92 |
93 | @Override
94 | public boolean dispatchTouchEvent(MotionEvent ev) {
95 | return super.dispatchTouchEvent(ev);
96 | }
97 |
98 |
99 | }
100 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/GooglePlayAdapter.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.adapter;
16 |
17 | import android.support.v7.widget.LinearLayoutManager;
18 | import android.support.v7.widget.RecyclerView;
19 | import android.util.Log;
20 | import android.view.View;
21 |
22 | import com.allen.recyclerview.R;
23 | import com.allen.recyclerview.data.DataServer;
24 | import com.allen.recyclerview.entry.MarryInfo;
25 | import com.allen.recyclerview.entry.News;
26 | import com.chad.library.adapter.base.BaseQuickAdapter;
27 | import com.chad.library.adapter.base.BaseViewHolder;
28 |
29 | import java.util.List;
30 |
31 | /**
32 | * 文 件 名: GooglePlayAdapter
33 | * 创 建 人: Allen
34 | * 创建日期: 16/12/29 10:31
35 | * 邮 箱: AllenCoder@126.com
36 | * 修改时间:
37 | * 修改备注:
38 | */
39 | public class GooglePlayAdapter extends BaseQuickAdapter implements BaseQuickAdapter.OnItemChildClickListener, BaseQuickAdapter.OnItemClickListener {
40 | public GooglePlayAdapter(final List data) {
41 | super(R.layout.item_googleplay,data);
42 | }
43 |
44 | @Override
45 | protected void convert(final BaseViewHolder baseViewHolder, final News news) {
46 | final RecyclerView recyclerView = (RecyclerView) baseViewHolder.getView(R.id.item_recyclerview);
47 | recyclerView.setLayoutManager(new LinearLayoutManager(baseViewHolder.getConvertView().getContext(),LinearLayoutManager.VERTICAL,false));
48 | recyclerView.setHasFixedSize(true);
49 | // HorizationAdapter mQuickAdapter = new HorizationAdapter(baseViewHolder.getConvertView().getContext(),5, (int) (Math.random()*10));
50 | final List marray = DataServer.getMarray(10);
51 | final HideAdapter mQuickAdapter = new HideAdapter(marray);
52 | mQuickAdapter.setOnItemClickListener(this);
53 | mQuickAdapter.setOnItemChildClickListener(this);
54 | recyclerView.setAdapter(mQuickAdapter);
55 | baseViewHolder.addOnClickListener(R.id.item_recyclerview);
56 | // recyclerView.addOnItemTouchListener(listener);
57 | }
58 |
59 | @Override
60 | public void onItemChildClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
61 | Log.e(TAG, "嵌套层收到点击事件: "+"点击了-次");
62 | }
63 |
64 | @Override
65 | public void onItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
66 | Log.e(TAG, "嵌套层ItemChild点击事件: "+"点击了-次");
67 |
68 |
69 |
70 | }
71 | // final OnItemClickListener listener = new OnItemClickListener() {
72 | // @Override
73 | // public void onSimpleItemClick(final BaseQuickAdapter baseQuickAdapter, final View view, final int i) {
74 | // Log.e(TAG, "嵌套层收到点击事件: "+"点击了-次");
75 | // }
76 | //
77 | // @Override
78 | // public void onItemChildClick(final BaseQuickAdapter adapter, final View view, final int position) {
79 | // super.onItemChildClick(adapter, view, position);
80 | // Log.e(TAG, "嵌套层ItemChild点击事件: "+"点击了-次");
81 | // }
82 | // };
83 | }
84 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/GooglePlayItemAdapter.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.adapter;
16 |
17 | import android.support.v7.widget.LinearLayoutManager;
18 | import android.support.v7.widget.RecyclerView;
19 |
20 | import com.allen.recyclerview.R;
21 | import com.allen.recyclerview.data.DataServer;
22 | import com.allen.recyclerview.entry.News;
23 | import com.chad.library.adapter.base.BaseQuickAdapter;
24 | import com.chad.library.adapter.base.BaseViewHolder;
25 |
26 | import java.util.List;
27 |
28 | /**
29 | * 文 件 名: GooglePlayItemAdapter
30 | * 创 建 人: Allen
31 | * 创建日期: 16/12/29 10:50
32 | * 邮 箱: AllenCoder@126.com
33 | * 修改时间:
34 | * 修改备注:
35 | */
36 | public class GooglePlayItemAdapter extends BaseQuickAdapter {
37 | public GooglePlayItemAdapter(final List data) {
38 | super(R.layout.item_googleplay,data);
39 | }
40 |
41 | @Override
42 | protected void convert(final BaseViewHolder baseViewHolder, final News news) {
43 | final RecyclerView recyclerView = (RecyclerView) baseViewHolder.getView(R.id.item_recyclerview);
44 | recyclerView.setLayoutManager(new LinearLayoutManager(baseViewHolder.getConvertView().getContext(),LinearLayoutManager.HORIZONTAL,false));
45 | recyclerView.setHasFixedSize(true);
46 | GooglePlayAdapter mQuickAdapter = new GooglePlayAdapter(DataServer.getNews());
47 | recyclerView.setAdapter(mQuickAdapter);
48 | }
49 | private void initAdapter() {
50 |
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/HideAdapter.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.adapter;
16 |
17 | import com.allen.recyclerview.R;
18 | import com.allen.recyclerview.entry.MarryInfo;
19 | import com.chad.library.adapter.base.BaseQuickAdapter;
20 | import com.chad.library.adapter.base.BaseViewHolder;
21 |
22 | import java.util.List;
23 |
24 | /**
25 | * 文 件 名: HideAdapter
26 | * 创 建 人: Allen
27 | * 创建日期: 17/1/6 22:41
28 | * 邮 箱: AllenCoder@126.com
29 | * 修改时间:
30 | * 修改备注:
31 | */
32 | public class HideAdapter extends BaseQuickAdapter {
33 | public HideAdapter(final List data) {
34 | super(R.layout.item_marray, data);
35 | }
36 |
37 | @Override
38 | protected void convert(final BaseViewHolder helper, final MarryInfo item) {
39 | helper
40 | .addOnClickListener(R.id.tv_unrepeat).
41 | addOnClickListener(R.id.tv_repeat).
42 | addOnClickListener(R.id.tv_valid).
43 | addOnClickListener(R.id.tv_invalid)
44 | // .setVisible(R.id.ly_a, item.isShow)
45 | // .setVisible(R.id.ly_b, !item.isShow)
46 | // .setVisible(R.id.tv_unrepeat, item.isShow)
47 | // .setVisible(R.id.tv_repeat, item.isShow)
48 | // .setVisible(R.id.tv_valid, !item.isShow)
49 | // .setVisible(R.id.tv_invalid, !item.isShow)
50 | .setText(R.id.tv_name, item.getName())
51 | .setText(R.id.tv_phone, item.getPhone());
52 |
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/HomeAdapter.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.adapter;
16 |
17 | import com.allen.recyclerview.R;
18 | import com.allen.recyclerview.entry.Home;
19 | import com.chad.library.adapter.base.BaseQuickAdapter;
20 | import com.chad.library.adapter.base.BaseViewHolder;
21 |
22 | import java.util.List;
23 |
24 | /**
25 | * 文 件 名: HomeAdapter
26 | * 创 建 人: Allen
27 | * 创建日期: 16/10/29 13:15
28 | * 邮 箱: AllenCoder@126.com
29 | * 修改时间:
30 | * 修改备注:
31 | */
32 | public class HomeAdapter extends BaseQuickAdapter {
33 | public HomeAdapter(final List data) {
34 | super(R.layout.item_activity, data);
35 | }
36 |
37 | public HomeAdapter(final int layoutResId, final List data) {
38 | super(R.layout.item_activity, data);
39 | }
40 |
41 | @Override
42 | protected void convert(final BaseViewHolder baseViewHolder, final Home home) {
43 | baseViewHolder.setText(R.id.tv_activity_title, home.Name);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/HorizationAdapter.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.adapter;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.LinearLayout;
8 |
9 | import com.allen.recyclerview.R;
10 | import com.allen.recyclerview.data.DataServer;
11 | import com.allen.recyclerview.entry.News;
12 | import com.chad.library.adapter.base.BaseQuickAdapter;
13 | import com.chad.library.adapter.base.BaseViewHolder;
14 |
15 | import static com.allen.recyclerview.R.layout.item;
16 |
17 | /**
18 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
19 | */
20 | public class HorizationAdapter extends BaseQuickAdapter {
21 | private LayoutInflater layoutInflater;
22 | private int N ;
23 |
24 | public HorizationAdapter(Context mContex, int N) {
25 | super(item, DataServer.getNews());
26 | this.N =N;
27 | layoutInflater =LayoutInflater.from(mContex);
28 | }
29 | public HorizationAdapter(Context mContex, int N,int X) {
30 | super(item, DataServer.getNews(X));
31 | this.N =N;
32 | layoutInflater =LayoutInflater.from(mContex);
33 | }
34 |
35 |
36 | @Override
37 | protected void convert(final BaseViewHolder newsViewHolder, final News news) {
38 | newsViewHolder.setText(R.id.tv_title,news.title);
39 | // newsViewHolder.addOnClickListener(R.id.btn_go);
40 | }
41 | @Override
42 | protected View getItemView(final int layoutResId, final ViewGroup parent) {
43 | View view = layoutInflater.inflate(R.layout.item_news_title, parent, false);
44 | view.setMinimumWidth(parent.getWidth() / N);
45 | LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(parent.getWidth() / N, ViewGroup.LayoutParams.MATCH_PARENT);
46 | view.setLayoutParams(parms);
47 | return view;
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/OptimeizeClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.adapter;
2 |
3 | import com.allen.recyclerview.R;
4 | import com.allen.recyclerview.data.DataServer;
5 | import com.allen.recyclerview.entry.Status;
6 | import com.chad.library.adapter.base.BaseQuickAdapter;
7 | import com.chad.library.adapter.base.BaseViewHolder;
8 |
9 | /**
10 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
11 | */
12 | public class OptimeizeClickAdapter extends BaseQuickAdapter {
13 | public OptimeizeClickAdapter() {
14 | super(R.layout.item_optimeize, DataServer.getSampleData(100));
15 | }
16 |
17 | public OptimeizeClickAdapter(int dataSize) {
18 | super(R.layout.item_optimeize, DataServer.getSampleData(dataSize));
19 | }
20 |
21 | @Override
22 | protected void convert(BaseViewHolder helper, Status item) {
23 | // helper.getConvertView().setBackgroundResource(R.drawable.card_click);
24 | // helper
25 | // .addOnClickListener(R.id.button)
26 | // .addOnClickListener(R.id.button2)
27 | // .addOnClickListener(R.id.button3)
28 | // .addOnClickListener(R.id.button4)
29 | // .addOnClickListener(R.id.button5)
30 | // .addOnClickListener(R.id.button6)
31 | // .addOnClickListener(R.id.button7)
32 | // .addOnClickListener(R.id.button8)
33 | // .addOnClickListener(R.id.button9)
34 | // .addOnClickListener(R.id.button10)
35 | // .addOnClickListener(R.id.button11)
36 | // .addOnClickListener(R.id.button12)
37 | // .addOnClickListener(R.id.button13)
38 | // .addOnClickListener(R.id.button14)
39 | // .addOnClickListener(R.id.button15)
40 | // .addOnClickListener(R.id.button16)
41 | // .addOnClickListener(R.id.button17)
42 | // .addOnClickListener(R.id.button18)
43 | // .addOnClickListener(R.id.button19)
44 | // .addOnClickListener(R.id.button20)
45 | // .addOnClickListener(R.id.button21)
46 | // .addOnClickListener(R.id.button22)
47 | // .addOnClickListener(R.id.button23)
48 | // .addOnClickListener(R.id.button25)
49 | // .addOnClickListener(R.id.button26)
50 | // .addOnClickListener(R.id.button27)
51 | // .addOnClickListener(R.id.button28)
52 | // .addOnClickListener(R.id.button29)
53 | // .addOnClickListener(R.id.button30)
54 | // .addOnClickListener(R.id.button31)
55 | // .addOnClickListener(R.id.button32)
56 | // .addOnClickListener(R.id.button33)
57 | // .addOnClickListener(R.id.button34)
58 | // .addOnClickListener(R.id.button35)
59 | // .addOnClickListener(R.id.button36)
60 | //
61 | // ;
62 | // Glide.with(mContext).load(item.getUserAvatar()).crossFade().placeholder(R.mipmap.def_head).transform(new GlideCircleTransform(mContext)).into((ImageView) helper.getView(R.id.tweetAvatar));
63 | }
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/OptimeizeGridItemClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.adapter;
2 |
3 | import com.allen.recyclerview.R;
4 | import com.allen.recyclerview.data.DataServer;
5 | import com.allen.recyclerview.entry.Status;
6 | import com.chad.library.adapter.base.BaseQuickAdapter;
7 | import com.chad.library.adapter.base.BaseViewHolder;
8 |
9 | /**
10 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
11 | */
12 | public class OptimeizeGridItemClickAdapter extends BaseQuickAdapter {
13 | public OptimeizeGridItemClickAdapter() {
14 | super(R.layout.item_optimeize, DataServer.getSampleData(100));
15 | }
16 |
17 | public OptimeizeGridItemClickAdapter(int dataSize) {
18 | super(R.layout.item_optimeize, DataServer.getSampleData(dataSize));
19 | }
20 |
21 | @Override
22 | protected void convert(BaseViewHolder helper, Status item) {
23 | // helper.getConvertView().setBackgroundResource(R.drawable.card_click);
24 |
25 |
26 | ;
27 | // Glide.with(mContext).load(item.getUserAvatar()).crossFade().placeholder(R.mipmap.def_head).transform(new GlideCircleTransform(mContext)).into((ImageView) helper.getView(R.id.tweetAvatar));
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/QuickClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.adapter;
2 |
3 | import com.allen.recyclerview.R;
4 | import com.allen.recyclerview.data.DataServer;
5 | import com.allen.recyclerview.entry.Status;
6 | import com.chad.library.adapter.base.BaseQuickAdapter;
7 | import com.chad.library.adapter.base.BaseViewHolder;
8 |
9 | /**
10 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
11 | */
12 | public class QuickClickAdapter extends BaseQuickAdapter {
13 | public QuickClickAdapter() {
14 | super(R.layout.item, DataServer.getSampleData(100));
15 | }
16 |
17 | public QuickClickAdapter(int dataSize) {
18 | super(R.layout.item, DataServer.getSampleData(dataSize));
19 | }
20 |
21 | @Override
22 | protected void convert(BaseViewHolder helper, Status item) {
23 | // helper.getConvertView().setBackgroundResource(R.drawable.card_click);
24 | helper.setText(R.id.tweetName, item.getUserName())
25 | .setText(R.id.tweetText, item.getText())
26 | .setText(R.id.tweetDate, item.getCreatedAt())
27 | .setVisible(R.id.tweetRT, item.isRetweet())
28 | .addOnClickListener(R.id.tweetAvatar)
29 | .addOnClickListener(R.id.tweetName)
30 | .addOnLongClickListener(R.id.tweetText)
31 | ;
32 | // Glide.with(mContext).load(item.getUserAvatar()).crossFade().placeholder(R.mipmap.def_head).transform(new GlideCircleTransform(mContext)).into((ImageView) helper.getView(R.id.tweetAvatar));
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/adapter/RefreshAdapter.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.adapter;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import com.allen.recyclerview.R;
9 | import com.allen.recyclerview.entry.News;
10 |
11 | import java.util.List;
12 |
13 | /**
14 | * Created by Allen on 2017/3/24.
15 | */
16 |
17 | public class RefreshAdapter extends RecyclerView.Adapter {
18 | private List list;
19 |
20 | public RefreshAdapter(List list) {
21 | this.list = list;
22 | }
23 |
24 | @Override
25 | public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
26 | View v = LayoutInflater.from(viewGroup.getContext())
27 | .inflate(R.layout.text_row_item, viewGroup, false);
28 |
29 | return new MyViewHolder(v);
30 | }
31 |
32 | @Override
33 | public void onBindViewHolder(MyViewHolder holder, int position) {
34 | }
35 |
36 | @Override
37 | public int getItemCount() {
38 | return list.size();
39 | }
40 | public static class MyViewHolder extends RecyclerView.ViewHolder{
41 |
42 | public MyViewHolder(View itemView) {
43 | super(itemView);
44 | }
45 | }
46 |
47 | //
48 | // public static class MyViewHolder extends RecyclerView.ViewHolder implements AnimateViewHolder {
49 | //
50 | // public ImageView imageView;
51 | // public MyViewHolder(View itemView) {
52 | // super(itemView);
53 | // }
54 | //
55 | // @Override
56 | // public void preAnimateRemoveImpl(RecyclerView.ViewHolder holder) {
57 | //
58 | // }
59 | //
60 | // @Override
61 | // public void animateRemoveImpl(RecyclerView.ViewHolder holder, ViewPropertyAnimatorListener listener) {
62 | // ViewCompat.animate(itemView)
63 | // .translationY(-itemView.getHeight() * 0.3f)
64 | // .alpha(0)
65 | // .setDuration(300)
66 | // .setListener(listener)
67 | // .start();
68 | // }
69 | //
70 | // @Override
71 | // public void preAnimateAddImpl(RecyclerView.ViewHolder holder) {
72 | // ViewCompat.setTranslationY(itemView, -itemView.getHeight() * 0.3f);
73 | // ViewCompat.setAlpha(itemView, 0);
74 | // }
75 | //
76 | // @Override
77 | // public void animateAddImpl(RecyclerView.ViewHolder holder, ViewPropertyAnimatorListener listener) {
78 | // ViewCompat.animate(itemView)
79 | // .translationY(0)
80 | // .alpha(1)
81 | // .setDuration(300)
82 | // .setListener(listener)
83 | // .start();
84 | // }
85 | // }
86 | }
87 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/component/CanvasView.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.component;
2 |
3 | import android.content.Context;
4 | import android.content.res.TypedArray;
5 | import android.graphics.Canvas;
6 | import android.graphics.Color;
7 | import android.graphics.Matrix;
8 | import android.graphics.Paint;
9 | import android.util.AttributeSet;
10 | import android.view.MotionEvent;
11 | import android.view.View;
12 |
13 | import com.allen.recyclerview.R;
14 |
15 | /**
16 | * TODO: document your custom view class.
17 | */
18 | public class CanvasView extends View {
19 |
20 | public CanvasView(Context context) {
21 | super(context);
22 | init(null, 0);
23 | }
24 |
25 | public CanvasView(Context context, AttributeSet attrs) {
26 | super(context, attrs);
27 | init(attrs, 0);
28 | }
29 |
30 | public CanvasView(Context context, AttributeSet attrs, int defStyle) {
31 | super(context, attrs, defStyle);
32 | init(attrs, defStyle);
33 | }
34 |
35 | private void init(AttributeSet attrs, int defStyle) {
36 | // Load attributes
37 | final TypedArray a = getContext().obtainStyledAttributes(
38 | attrs, R.styleable.CanvasView, defStyle, 0);
39 |
40 | a.recycle();
41 | mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
42 | mPaint.setStrokeWidth(10);
43 | mPaint.setColor(Color.RED);
44 |
45 | }
46 |
47 | private Paint mPaint;
48 |
49 | @Override
50 | protected void onDraw(Canvas canvas) {
51 | super.onDraw(canvas);
52 | // canvas.drawCircle(getWidth()/2-80,getHeight()/2-60,100,mPaint);
53 | //
54 | // canvas.drawRect(getWidth()/2-220,getHeight()/2+50,getWidth()/2+20,getHeight()/2+250,mPaint);
55 | Matrix matrix = new Matrix();
56 | matrix = new Matrix();
57 | matrix.postScale(2, 2);
58 | // canvas.save();
59 | canvas.setMatrix(matrix);
60 | mPaint.setColor(Color.RED);
61 | // canvas.concat(matrix);
62 | canvas.drawRect(100, 100, 300, 300, mPaint);
63 | // canvas.restore();
64 | mPaint.setColor(Color.YELLOW);
65 | canvas.drawRect(300, 300, 500, 500, mPaint);
66 | canvas.drawText("canvas.setMatrix(matrix)", 50, 600, mPaint);
67 | }
68 |
69 | @Override
70 | public boolean onTouchEvent(final MotionEvent event) {
71 | switch (event.getAction()) {
72 |
73 | }
74 | return super.onTouchEvent(event);
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/data/DataServer.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.data;
2 |
3 |
4 | import com.allen.recyclerview.entry.MarryInfo;
5 | import com.allen.recyclerview.entry.News;
6 | import com.allen.recyclerview.entry.Status;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | /**
12 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
13 | */
14 | public class DataServer {
15 |
16 | private static final String HTTPS_AVATARS1_GITHUBUSERCONTENT_COM_LINK = "https://avatars1.githubusercontent.com/u/7698209?v=3&s=460";
17 | private static final String CYM_CHAD = "CymChad";
18 |
19 | private DataServer() {
20 | }
21 |
22 | public static List getSampleData(int lenth) {
23 | List list = new ArrayList<>();
24 | for (int i = 0; i < lenth; i++) {
25 | Status status = new Status();
26 | status.setUserName("Chad" + i);
27 | status.setCreatedAt("04/05/" + i);
28 | status.setRetweet(i % 2 == 0);
29 | status.setUserAvatar("https://avatars1.githubusercontent.com/u/7698209?v=3&s=460");
30 | status.setText("BaseRecyclerViewAdpaterHelper https://www.recyclerview.org");
31 | list.add(status);
32 | }
33 | return list;
34 | }
35 |
36 | public static List getNews() {
37 | List list = new ArrayList<>();
38 | News news = new News("头条");
39 | list.add(news);
40 | news = new News("热点");
41 | list.add(news);
42 | news = new News("精选");
43 | list.add(news);
44 | news = new News("上海");
45 | list.add(news);
46 | news = new News("财经");
47 | list.add(news);
48 | news = new News("科技");
49 | list.add(news);
50 | news = new News("段子");
51 | list.add(news);
52 | news = new News("视频");
53 | list.add(news);
54 | news = new News("网易");
55 | list.add(news);
56 | news = new News("图片");
57 | list.add(news);
58 | news = new News("直播");
59 | list.add(news);
60 | news = new News("汽车");
61 | list.add(news);
62 | for (int i = 0; i < 1000; i++) {
63 | news = new News("汽车"+i);
64 | list.add(news);
65 | }
66 | return list;
67 | }
68 | public static List getNews(int j) {
69 | List list = new ArrayList<>();
70 | News news = new News("头条");
71 | // list.add(news);
72 | // news = new News("热点");
73 | // list.add(news);
74 | // news = new News("精选");
75 | // list.add(news);
76 | // news = new News("上海");
77 | // list.add(news);
78 | // news = new News("财经");
79 | // list.add(news);
80 | // news = new News("科技");
81 | // list.add(news);
82 | // news = new News("段子");
83 | // list.add(news);
84 | // news = new News("视频");
85 | // list.add(news);
86 | // news = new News("网易");
87 | // list.add(news);
88 | // news = new News("图片");
89 | // list.add(news);
90 | // news = new News("直播");
91 | // list.add(news);
92 | // news = new News("汽车");
93 | list.add(news);
94 | for (int i = 0; i < j; i++) {
95 | news = new News("汽车"+i);
96 | list.add(news);
97 | }
98 | return list;
99 | }
100 | public static List getMarray(int j) {
101 | List list = new ArrayList<>();
102 | for (int i = 0; i < j; i++) {
103 | MarryInfo news = new MarryInfo("小明","137****5872",true,true);
104 | list.add(news);
105 | }
106 |
107 | return list;
108 | }
109 |
110 | public static List addData(List list, int dataSize) {
111 | for (int i = 0; i < dataSize; i++) {
112 | Status status = new Status();
113 | status.setUserName("Chad" + i);
114 | status.setCreatedAt("04/05/" + i);
115 | status.setRetweet(i % 2 == 0);
116 | status.setUserAvatar("https://avatars1.githubusercontent.com/u/7698209?v=3&s=460");
117 | status.setText("Powerful and flexible RecyclerAdapter https://github.com/CymChad/BaseRecyclerViewAdapterHelper");
118 | list.add(status);
119 | }
120 |
121 | return list;
122 | }
123 |
124 |
125 | }
126 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/entry/Home.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.entry;
16 |
17 | /**
18 | * 文 件 名: Home
19 | * 创 建 人: Allen
20 | * 创建日期: 16/10/29 13:15
21 | * 邮 箱: AllenCoder@126.com
22 | * 修改时间:
23 | * 修改备注:
24 | */
25 | public class Home {
26 | public Home(final String name) {
27 | Name = name;
28 | }
29 |
30 | public String Name;
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/entry/MarryInfo.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.entry;
16 |
17 | /**
18 | * 文 件 名: MarryInfo
19 | * 创 建 人: Allen
20 | * 创建日期: 17/1/6 22:44
21 | * 邮 箱: AllenCoder@126.com
22 | * 修改时间:
23 | * 修改备注:
24 | */
25 | public class MarryInfo {
26 |
27 | private String name;
28 | private String phone;
29 | private boolean isRepeat;
30 | private boolean isValid;
31 | public boolean isShow=false;
32 |
33 |
34 | public MarryInfo(final String name, final String phone, final boolean isRepeat, final boolean isValid) {
35 | this.name = name;
36 | this.phone = phone;
37 | this.isRepeat = isRepeat;
38 | this.isValid = isValid;
39 | }
40 |
41 | public String getName() {
42 | return name;
43 | }
44 |
45 | public void setName(final String name) {
46 | this.name = name;
47 | }
48 |
49 | public String getPhone() {
50 | return phone;
51 | }
52 |
53 | public void setPhone(final String phone) {
54 | this.phone = phone;
55 | }
56 |
57 | public boolean isRepeat() {
58 | return isRepeat;
59 | }
60 |
61 | public void setRepeat(final boolean repeat) {
62 | isRepeat = repeat;
63 | }
64 |
65 | public boolean isValid() {
66 | return isValid;
67 | }
68 |
69 | public void setValid(final boolean valid) {
70 | isValid = valid;
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/entry/News.java:
--------------------------------------------------------------------------------
1 | /*
2 | ******************************* Copyright (c)*********************************\
3 | **
4 | ** (c) Copyright 2015, Allen, china, shanghai
5 | ** All Rights Reserved
6 | **
7 | **
8 | **
9 | **-----------------------------------版本信息------------------------------------
10 | ** 版 本: V0.1
11 | **
12 | **------------------------------------------------------------------------------
13 | ********************************End of Head************************************\
14 | */
15 | package com.allen.recyclerview.entry;
16 |
17 | /**
18 | * 文 件 名: Home
19 | * 创 建 人: Allen
20 | * 创建日期: 16/10/29 13:15
21 | * 邮 箱: AllenCoder@126.com
22 | * 修改时间:
23 | * 修改备注:
24 | */
25 | public class News {
26 | public News(final String title) {
27 | this.title = title;
28 | }
29 |
30 | public String title;
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/entry/Status.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.entry;
2 |
3 | /**
4 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
5 | */
6 | public class Status {
7 | private boolean isRetweet;
8 | private String text;
9 | private String userName;
10 | private String userAvatar;
11 | private String createdAt;
12 |
13 | public boolean isRetweet() {
14 | return isRetweet;
15 | }
16 |
17 | public void setRetweet(boolean retweet) {
18 | isRetweet = retweet;
19 | }
20 |
21 | public String getText() {
22 | return text;
23 | }
24 |
25 | public void setText(String text) {
26 | this.text = text;
27 | }
28 |
29 | public String getUserName() {
30 | return userName;
31 | }
32 |
33 | public void setUserName(String userName) {
34 | this.userName = userName;
35 | }
36 |
37 | public String getUserAvatar() {
38 | return userAvatar;
39 | }
40 |
41 | public void setUserAvatar(String userAvatar) {
42 | this.userAvatar = userAvatar;
43 | }
44 |
45 | public String getCreatedAt() {
46 | return createdAt;
47 | }
48 |
49 | public void setCreatedAt(String createdAt) {
50 | this.createdAt = createdAt;
51 | }
52 |
53 | @Override
54 | public String toString() {
55 | return "Status{" +
56 | "isRetweet=" + isRetweet +
57 | ", text='" + text + '\'' +
58 | ", userName='" + userName + '\'' +
59 | ", userAvatar='" + userAvatar + '\'' +
60 | ", createdAt='" + createdAt + '\'' +
61 | '}';
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/app/src/main/java/com/allen/recyclerview/view/ScrollByView.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview.view;
2 |
3 | import android.content.Context;
4 | import android.content.res.TypedArray;
5 | import android.graphics.Canvas;
6 | import android.support.v4.view.ViewCompat;
7 | import android.util.AttributeSet;
8 | import android.view.MotionEvent;
9 | import android.view.VelocityTracker;
10 | import android.view.ViewConfiguration;
11 | import android.widget.FrameLayout;
12 | import android.widget.OverScroller;
13 |
14 | import com.allen.recyclerview.R;
15 | import com.chad.library.adapter.base.util.TouchEventUtil;
16 | import com.orhanobut.logger.Logger;
17 |
18 | public class ScrollByView extends FrameLayout {
19 |
20 |
21 | private int mLastX;
22 | private int mLastY;
23 | private boolean mDragging;
24 | private float mDownX;
25 | private float mDownY;
26 | private int mScaledMinimumFlingVelocity;
27 | private int mScaledMaximumFlingVelocity;
28 | private int mScaledTouchSlop;
29 | private OverScroller mScroller;
30 | public ScrollByView(Context context) {
31 | super(context);
32 | init(null, 0);
33 | }
34 |
35 | public ScrollByView(Context context, AttributeSet attrs) {
36 | super(context, attrs);
37 | init(attrs, 0);
38 | }
39 |
40 | public ScrollByView(Context context, AttributeSet attrs, int defStyle) {
41 | super(context, attrs, defStyle);
42 | init(attrs, defStyle);
43 | }
44 |
45 | private void init(AttributeSet attrs, int defStyle) {
46 | // Load attributes
47 | final TypedArray a = getContext().obtainStyledAttributes(
48 | attrs, R.styleable.ScrollByView, defStyle, 0);
49 |
50 | ViewConfiguration configuration = ViewConfiguration.get(getContext());
51 | mScaledTouchSlop = configuration.getScaledTouchSlop();
52 | mScaledMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
53 | mScaledMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity();
54 | mScroller = new OverScroller(getContext());
55 | a.recycle();
56 |
57 | }
58 |
59 | @Override
60 | public boolean onInterceptTouchEvent(MotionEvent ev) {
61 | // boolean isIntercepted = super.onInterceptTouchEvent(ev);
62 | // int action = ev.getAction();
63 | // switch (action) {
64 | // case MotionEvent.ACTION_DOWN: {
65 | // mDownX = mLastX = (int) ev.getX();
66 | // mDownY = (int) ev.getY();
67 | // return false;
68 | // }
69 | // case MotionEvent.ACTION_MOVE: {
70 | // int disX = (int) (ev.getX() - mDownX);
71 | // int disY = (int) (ev.getY() - mDownY);
72 | // return Math.abs(disX) > mScaledTouchSlop && Math.abs(disX) > Math.abs(disY);
73 | // }
74 | // case MotionEvent.ACTION_UP: {
75 | //
76 | // return false;
77 | // }
78 | // case MotionEvent.ACTION_CANCEL: {
79 | // if (!mScroller.isFinished())
80 | // mScroller.abortAnimation();
81 | // return false;
82 | // }
83 | // }
84 | return true;
85 | }
86 | @Override
87 | protected void onDraw(Canvas canvas) {
88 | super.onDraw(canvas);
89 | }
90 | private VelocityTracker mVelocityTracker;
91 | @Override
92 | public boolean onTouchEvent(MotionEvent ev) {
93 | Logger.d( TouchEventUtil.getTouchAction(ev.getAction()));
94 | if (mVelocityTracker == null) mVelocityTracker = VelocityTracker.obtain();
95 | mVelocityTracker.addMovement(ev);
96 | int dx;
97 | int dy;
98 | int action = ev.getAction();
99 | switch (action) {
100 | case MotionEvent.ACTION_DOWN: {
101 | mLastX = (int) ev.getX();
102 | mLastY = (int) ev.getY();
103 | break;
104 | }
105 | case MotionEvent.ACTION_MOVE: {
106 | int disX = (int) (mLastX - ev.getX());
107 | int disY = (int) (mLastY - ev.getY());
108 | if (!mDragging && Math.abs(disX) > mScaledTouchSlop && Math.abs(disX) > Math.abs(disY)) {
109 | mDragging = true;
110 | }
111 | // scrollBy(disX, 0);
112 | // getChildAt(1).layout(-disX,disY,-disX+200,disY+200);
113 | getChildAt(0).layout(disX,disY,disX+200,disY+200);
114 | // getChildAt(0).layout(disX,disY,disX+200,disY+200);
115 | // scrollBy(disX, 0);
116 | // if (mDragging) {
117 | // scrollBy(disX, 0);
118 | // mLastX = (int) ev.getX();
119 | // mLastY = (int) ev.getY();
120 | // }
121 | break;
122 | }
123 | case MotionEvent.ACTION_UP: {
124 | dx = (int) (mDownX - ev.getX());
125 | dy = (int) (mDownY - ev.getY());
126 | mDragging = false;
127 | mVelocityTracker.computeCurrentVelocity(1000, mScaledMaximumFlingVelocity);
128 | int velocityX = (int) mVelocityTracker.getXVelocity();
129 | int velocity = Math.abs(velocityX);
130 | if (velocity > mScaledMinimumFlingVelocity) {
131 | ViewCompat.postInvalidateOnAnimation(this);
132 | } else {
133 | // judgeOpenClose(dx, dy);
134 | }
135 | getChildAt(0).layout(dx+velocityX,dy+velocity,dx+velocityX+200,dy+velocity+200);
136 | mVelocityTracker.clear();
137 | mVelocityTracker.recycle();
138 | mVelocityTracker = null;
139 | if (Math.abs(mDownX - ev.getX()) > mScaledTouchSlop
140 | || Math.abs(mDownY - ev.getY()) > mScaledTouchSlop
141 | ) {
142 | ev.setAction(MotionEvent.ACTION_CANCEL);
143 | super.onTouchEvent(ev);
144 | return true;
145 | }
146 | break;
147 | }
148 | case MotionEvent.ACTION_CANCEL: {
149 | mDragging = false;
150 | if (!mScroller.isFinished()) {
151 | mScroller.abortAnimation();
152 | } else {
153 | dx = (int) (mDownX - ev.getX());
154 | dy = (int) (mDownY - ev.getY());
155 | }
156 | break;
157 | }
158 | }
159 |
160 | return super.onTouchEvent(ev);
161 | }
162 |
163 | }
164 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/touch_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 | -
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selector_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selector_item_child.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/touch_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_custom_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
25 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_hide.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_horizontal_adjust.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
14 |
18 |
25 |
29 |
36 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
16 |
17 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_local_refresh.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_optimize_item_click.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_recycler_click.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
20 |
21 |
26 |
27 |
28 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_recyclerview_nest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_rotate.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_test.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
19 |
24 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_optimize_item_click.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item.xml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
16 |
17 |
26 |
27 |
34 |
35 |
43 |
44 |
54 |
55 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_click_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_googleplay.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_grid_optimeize.xml:
--------------------------------------------------------------------------------
1 |
9 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_marray.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
19 |
27 |
28 |
34 |
43 |
49 |
58 |
59 |
65 |
74 |
80 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_news_title.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_optimeize.xml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
14 |
15 |
19 |
20 |
24 |
25 |
29 |
30 |
34 |
35 |
39 |
40 |
44 |
45 |
49 |
50 |
51 |
55 |
56 |
60 |
61 |
65 |
66 |
70 |
71 |
75 |
76 |
80 |
81 |
85 |
86 |
90 |
91 |
92 |
96 |
97 |
101 |
102 |
106 |
107 |
111 |
112 |
116 |
117 |
121 |
122 |
126 |
127 |
131 |
132 |
133 |
137 |
138 |
142 |
143 |
147 |
148 |
152 |
153 |
157 |
158 |
162 |
163 |
167 |
168 |
172 |
173 |
174 |
178 |
179 |
183 |
184 |
188 |
189 |
193 |
194 |
198 |
199 |
203 |
204 |
208 |
209 |
213 |
214 |
215 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/text_row_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/def_head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-xhdpi/def_head.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/retweet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-xhdpi/retweet.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs_canvas_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs_scroll_by_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 | #00000000
8 | #14acae
9 | #1d1e1e
10 | #c3c9ce
11 | #e0e4e7
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 | 50dp
7 | 50dp
8 | 6dp
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/refs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Recyclerview
3 | OptimizeItemClickActivity
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
20 |
21 |
25 |
26 |
30 |
31 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/test/java/com/allen/recyclerview/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.allen.recyclerview;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | mavenLocal()
7 | mavenCentral()
8 |
9 | }
10 | dependencies {
11 | classpath 'com.android.tools.build:gradle:2.3.1'
12 | classpath 'com.github.xfumihiro.view-inspector:view-inspector-plugin:0.1.1'
13 | classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
14 | // classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.3')
15 | // NOTE: Do not place your application dependencies here; they belong
16 | // in the individual module build.gradle files
17 | }
18 | }
19 |
20 | allprojects {
21 | repositories {
22 | jcenter()
23 | maven { url "https://jitpack.io" }
24 | mavenCentral()
25 | }
26 | }
27 |
28 | task clean(type: Delete) {
29 | delete rootProject.buildDir
30 | }
31 |
--------------------------------------------------------------------------------
/gif/divide.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/gif/divide.gif
--------------------------------------------------------------------------------
/gif/news.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/gif/news.jpg
--------------------------------------------------------------------------------
/gif/sample1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/gif/sample1.gif
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 | TINKER_VERSION=1.7.3
19 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Oct 29 11:16:05 CST 2016
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.4-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/library-release/build.gradle:
--------------------------------------------------------------------------------
1 | configurations.maybeCreate("default")
2 | artifacts.add("default", file('library-release.aar'))
--------------------------------------------------------------------------------
/library-release/library-release.aar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/library-release/library-release.aar
--------------------------------------------------------------------------------
/library/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle/
2 | .DS_Store
3 | local.properties
4 |
5 | # build files
6 | build/
7 | bin/
8 | gen/
9 | output/
10 |
11 | # android studio
12 | *.iml
13 | .idea
14 |
--------------------------------------------------------------------------------
/library/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'com.jakewharton.hugo'
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion '25.0.2'
6 | defaultConfig {
7 | minSdkVersion 14
8 | targetSdkVersion 25
9 | versionCode 1
10 | versionName "1.0"
11 |
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 |
14 | }
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19 | }
20 | }
21 | }
22 |
23 |
24 | dependencies {
25 | compile fileTree(include: ['*.jar'], dir: 'libs')
26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
27 | exclude group: 'com.android.support', module: 'support-annotations'
28 | })
29 | compile 'com.android.support:appcompat-v7:25.3.0'
30 | provided 'com.android.support:recyclerview-v7:25.3.0'
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/library/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/huasheng/Desktop/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/library/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base;
2 |
3 | import android.graphics.Canvas;
4 | import android.support.annotation.NonNull;
5 | import android.support.v4.view.MotionEventCompat;
6 | import android.support.v7.widget.RecyclerView;
7 | import android.support.v7.widget.helper.ItemTouchHelper;
8 | import android.view.MotionEvent;
9 | import android.view.View;
10 |
11 | import com.chad.library.R;
12 | import com.chad.library.adapter.base.callback.ItemDragAndSwipeCallback;
13 | import com.chad.library.adapter.base.listener.OnItemDragListener;
14 | import com.chad.library.adapter.base.listener.OnItemSwipeListener;
15 |
16 | import java.util.Collections;
17 | import java.util.List;
18 |
19 | /**
20 | * Created by luoxw on 2016/7/13.
21 | */
22 | public abstract class BaseItemDraggableAdapter extends com.chad.library.adapter.base.BaseQuickAdapter {
23 |
24 | private static final int NO_TOGGLE_VIEW = 0;
25 | protected int mToggleViewId = NO_TOGGLE_VIEW;
26 | protected ItemTouchHelper mItemTouchHelper;
27 | protected boolean itemDragEnabled = false;
28 | protected boolean itemSwipeEnabled = false;
29 | protected OnItemDragListener mOnItemDragListener;
30 | protected OnItemSwipeListener mOnItemSwipeListener;
31 | protected boolean mDragOnLongPress = true;
32 |
33 | protected View.OnTouchListener mOnToggleViewTouchListener;
34 | protected View.OnLongClickListener mOnToggleViewLongClickListener;
35 |
36 | private static final String ERROR_NOT_SAME_ITEMTOUCHHELPER = "Item drag and item swipe should pass the same ItemTouchHelper";
37 |
38 |
39 | public BaseItemDraggableAdapter(List data) {
40 | super(data);
41 | }
42 |
43 | public BaseItemDraggableAdapter(int layoutResId, List data) {
44 | super(layoutResId, data);
45 | }
46 |
47 |
48 | /**
49 | * To bind different types of holder and solve different the bind events
50 | *
51 | * @param holder
52 | * @param positions
53 | * @see #getDefItemViewType(int)
54 | */
55 | @Override
56 | public void onBindViewHolder(K holder, int positions) {
57 | super.onBindViewHolder(holder, positions);
58 | int viewType = holder.getItemViewType();
59 |
60 | if (mItemTouchHelper != null && itemDragEnabled && viewType != LOADING_VIEW && viewType != HEADER_VIEW
61 | && viewType != EMPTY_VIEW && viewType != FOOTER_VIEW) {
62 | if (mToggleViewId != NO_TOGGLE_VIEW) {
63 | View toggleView = ((com.chad.library.adapter.base.BaseViewHolder) holder).getView(mToggleViewId);
64 | if (toggleView != null) {
65 | toggleView.setTag(R.id.BaseQuickAdapter_viewholder_support, holder);
66 | if (mDragOnLongPress) {
67 | toggleView.setOnLongClickListener(mOnToggleViewLongClickListener);
68 | } else {
69 | toggleView.setOnTouchListener(mOnToggleViewTouchListener);
70 | }
71 | }
72 | } else {
73 | holder.itemView.setTag(R.id.BaseQuickAdapter_viewholder_support, holder);
74 | holder.itemView.setOnLongClickListener(mOnToggleViewLongClickListener);
75 | }
76 | }
77 | }
78 |
79 |
80 | /**
81 | * Set the toggle view's id which will trigger drag event.
82 | * If the toggle view id is not set, drag event will be triggered when the item is long pressed.
83 | *
84 | * @param toggleViewId the toggle view's id
85 | */
86 | public void setToggleViewId(int toggleViewId) {
87 | mToggleViewId = toggleViewId;
88 | }
89 |
90 | /**
91 | * Set the drag event should be trigger on long press.
92 | * Work when the toggleViewId has been set.
93 | *
94 | * @param longPress by default is true.
95 | */
96 | public void setToggleDragOnLongPress(boolean longPress) {
97 | mDragOnLongPress = longPress;
98 | if (mDragOnLongPress) {
99 | mOnToggleViewTouchListener = null;
100 | mOnToggleViewLongClickListener = new View.OnLongClickListener() {
101 | @Override
102 | public boolean onLongClick(View v) {
103 | if (mItemTouchHelper != null && itemDragEnabled) {
104 | mItemTouchHelper.startDrag((RecyclerView.ViewHolder) v.getTag(R.id.BaseQuickAdapter_viewholder_support));
105 | }
106 | return true;
107 | }
108 | };
109 | } else {
110 | mOnToggleViewTouchListener = new View.OnTouchListener() {
111 | @Override
112 | public boolean onTouch(View v, MotionEvent event) {
113 | if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN
114 | && !mDragOnLongPress) {
115 | if (mItemTouchHelper != null && itemDragEnabled) {
116 | mItemTouchHelper.startDrag((RecyclerView.ViewHolder) v.getTag(R.id.BaseQuickAdapter_viewholder_support));
117 | }
118 | return true;
119 | } else {
120 | return false;
121 | }
122 | }
123 | };
124 | mOnToggleViewLongClickListener = null;
125 | }
126 | }
127 |
128 | /**
129 | * Enable drag items.
130 | * Use itemView as the toggleView when long pressed.
131 | *
132 | * @param itemTouchHelper {@link ItemTouchHelper}
133 | */
134 | public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper) {
135 | enableDragItem(itemTouchHelper, NO_TOGGLE_VIEW, true);
136 | }
137 |
138 | /**
139 | * Enable drag items. Use the specified view as toggle.
140 | *
141 | * @param itemTouchHelper {@link ItemTouchHelper}
142 | * @param toggleViewId The toggle view's id.
143 | * @param dragOnLongPress If true the drag event will be trigger on long press, otherwise on touch down.
144 | */
145 | public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper, int toggleViewId, boolean dragOnLongPress) {
146 | itemDragEnabled = true;
147 | mItemTouchHelper = itemTouchHelper;
148 | setToggleViewId(toggleViewId);
149 | setToggleDragOnLongPress(dragOnLongPress);
150 | }
151 |
152 | /**
153 | * Disable drag items.
154 | */
155 | public void disableDragItem() {
156 | itemDragEnabled = false;
157 | mItemTouchHelper = null;
158 | }
159 |
160 | public boolean isItemDraggable() {
161 | return itemDragEnabled;
162 | }
163 |
164 | /**
165 | * Enable swipe items.
166 | * You should attach {@link ItemTouchHelper} which construct with {@link ItemDragAndSwipeCallback} to the Recycler when you enable this.
167 | */
168 | public void enableSwipeItem() {
169 | itemSwipeEnabled = true;
170 | }
171 |
172 | public void disableSwipeItem() {
173 | itemSwipeEnabled = false;
174 | }
175 |
176 | public boolean isItemSwipeEnable() {
177 | return itemSwipeEnabled;
178 | }
179 |
180 | /**
181 | * @param onItemDragListener Register a callback to be invoked when drag event happen.
182 | */
183 | public void setOnItemDragListener(OnItemDragListener onItemDragListener) {
184 | mOnItemDragListener = onItemDragListener;
185 | }
186 |
187 | public int getViewHolderPosition(RecyclerView.ViewHolder viewHolder) {
188 | return viewHolder.getAdapterPosition() - getHeaderLayoutCount();
189 | }
190 |
191 | public void onItemDragStart(RecyclerView.ViewHolder viewHolder) {
192 | if (mOnItemDragListener != null && itemDragEnabled) {
193 | mOnItemDragListener.onItemDragStart(viewHolder, getViewHolderPosition(viewHolder));
194 | }
195 | }
196 |
197 | public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
198 | int from = getViewHolderPosition(source);
199 | int to = getViewHolderPosition(target);
200 |
201 | if (from < to) {
202 | for (int i = from; i < to; i++) {
203 | Collections.swap(mData, i, i + 1);
204 | }
205 | } else {
206 | for (int i = from; i > to; i--) {
207 | Collections.swap(mData, i, i - 1);
208 | }
209 | }
210 | notifyItemMoved(source.getAdapterPosition(), target.getAdapterPosition());
211 |
212 | if (mOnItemDragListener != null && itemDragEnabled) {
213 | mOnItemDragListener.onItemDragMoving(source, from, target, to);
214 | }
215 | }
216 |
217 | public void onItemDragEnd(RecyclerView.ViewHolder viewHolder) {
218 | if (mOnItemDragListener != null && itemDragEnabled) {
219 | mOnItemDragListener.onItemDragEnd(viewHolder, getViewHolderPosition(viewHolder));
220 | }
221 | }
222 |
223 | public void setOnItemSwipeListener(OnItemSwipeListener listener) {
224 | mOnItemSwipeListener = listener;
225 | }
226 |
227 | public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder) {
228 | if (mOnItemSwipeListener != null && itemSwipeEnabled) {
229 | mOnItemSwipeListener.onItemSwipeStart(viewHolder, getViewHolderPosition(viewHolder));
230 | }
231 | }
232 |
233 | public void onItemSwipeClear(RecyclerView.ViewHolder viewHolder) {
234 | if (mOnItemSwipeListener != null && itemSwipeEnabled) {
235 | mOnItemSwipeListener.clearView(viewHolder, getViewHolderPosition(viewHolder));
236 | }
237 | }
238 |
239 | public void onItemSwiped(RecyclerView.ViewHolder viewHolder) {
240 | if (mOnItemSwipeListener != null && itemSwipeEnabled) {
241 | mOnItemSwipeListener.onItemSwiped(viewHolder, getViewHolderPosition(viewHolder));
242 | }
243 |
244 | int pos = getViewHolderPosition(viewHolder);
245 |
246 | mData.remove(pos);
247 | notifyItemRemoved(viewHolder.getAdapterPosition());
248 | }
249 |
250 | public void onItemSwiping(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) {
251 | if (mOnItemSwipeListener != null && itemSwipeEnabled) {
252 | mOnItemSwipeListener.onItemSwipeMoving(canvas, viewHolder, dX, dY, isCurrentlyActive);
253 | }
254 | }
255 |
256 | }
257 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base;
2 |
3 | import android.support.annotation.LayoutRes;
4 | import android.util.SparseArray;
5 | import android.view.ViewGroup;
6 |
7 | import com.chad.library.adapter.base.entity.MultiItemEntity;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
13 | */
14 | public abstract class BaseMultiItemQuickAdapter extends BaseQuickAdapter {
15 |
16 | /**
17 | * layouts indexed with their types
18 | */
19 | private SparseArray layouts;
20 |
21 | private static final int DEFAULT_VIEW_TYPE = -0xff;
22 |
23 | /**
24 | * Same as QuickAdapter#QuickAdapter(Context,int) but with
25 | * some initialization data.
26 | *
27 | * @param data A new list is created out of this one to avoid mutable list
28 | */
29 | public BaseMultiItemQuickAdapter( List data) {
30 | super( data);
31 | }
32 |
33 | @Override
34 | protected int getDefItemViewType(int position) {
35 | Object item = mData.get(position);
36 | if (item instanceof MultiItemEntity) {
37 | return ((MultiItemEntity)item).getItemType();
38 | }
39 | return DEFAULT_VIEW_TYPE;
40 | }
41 |
42 | protected void setDefaultViewTypeLayout(@LayoutRes int layoutResId) {
43 | addItemType(DEFAULT_VIEW_TYPE, layoutResId);
44 | }
45 |
46 | @Override
47 | protected K onCreateDefViewHolder(ViewGroup parent, int viewType) {
48 | return createBaseViewHolder(parent, getLayoutId(viewType));
49 | }
50 |
51 | private int getLayoutId(int viewType) {
52 | return layouts.get(viewType);
53 | }
54 |
55 | protected void addItemType(int type, @LayoutRes int layoutResId) {
56 | if (layouts == null) {
57 | layouts = new SparseArray<>();
58 | }
59 | layouts.put(type, layoutResId);
60 | }
61 |
62 |
63 | }
64 |
65 |
66 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/BaseSectionQuickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base;
2 |
3 | import android.view.ViewGroup;
4 |
5 | import com.chad.library.adapter.base.entity.SectionEntity;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
11 | */
12 | public abstract class BaseSectionQuickAdapter extends BaseQuickAdapter {
13 |
14 |
15 | protected int mSectionHeadResId;
16 | protected static final int SECTION_HEADER_VIEW = 0x00000444;
17 |
18 | /**
19 | * Same as QuickAdapter#QuickAdapter(Context,int) but with
20 | * some initialization data.
21 | *
22 | * @param sectionHeadResId The section head layout id for each item
23 | * @param layoutResId The layout resource id of each item.
24 | * @param data A new list is created out of this one to avoid mutable list
25 | */
26 | public BaseSectionQuickAdapter( int layoutResId, int sectionHeadResId, List data) {
27 | super(layoutResId, data);
28 | this.mSectionHeadResId = sectionHeadResId;
29 | }
30 |
31 | @Override
32 | protected int getDefItemViewType(int position) {
33 | return mData.get(position).isHeader ? SECTION_HEADER_VIEW : 0;
34 | }
35 |
36 | @Override
37 | protected K onCreateDefViewHolder(ViewGroup parent, int viewType) {
38 | if (viewType == SECTION_HEADER_VIEW)
39 | return createBaseViewHolder(getItemView(mSectionHeadResId, parent));
40 |
41 | return super.onCreateDefViewHolder(parent, viewType);
42 | }
43 |
44 | @Override
45 | public void onBindViewHolder(K holder, int positions) {
46 | switch (holder.getItemViewType()) {
47 | case SECTION_HEADER_VIEW:
48 | setFullSpan(holder);
49 | convertHead(holder, mData.get(holder.getLayoutPosition() - getHeaderLayoutCount()));
50 | break;
51 | default:
52 | super.onBindViewHolder(holder, positions);
53 | break;
54 | }
55 | }
56 |
57 | protected abstract void convertHead(BaseViewHolder helper, T item);
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/AlphaInAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 |
8 | /**
9 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
10 | */
11 | public class AlphaInAnimation implements BaseAnimation {
12 |
13 | private static final float DEFAULT_ALPHA_FROM = 0f;
14 | private final float mFrom;
15 |
16 | public AlphaInAnimation() {
17 | this(DEFAULT_ALPHA_FROM);
18 | }
19 |
20 | public AlphaInAnimation(float from) {
21 | mFrom = from;
22 | }
23 |
24 | @Override
25 | public Animator[] getAnimators(View view) {
26 | return new Animator[]{ObjectAnimator.ofFloat(view, "alpha", mFrom, 1f)};
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/BaseAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.view.View;
5 |
6 | /**
7 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
8 | */
9 | public interface BaseAnimation {
10 |
11 | Animator[] getAnimators(View view);
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/ScaleInAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 |
8 | /**
9 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
10 | */
11 | public class ScaleInAnimation implements BaseAnimation {
12 |
13 | private static final float DEFAULT_SCALE_FROM = .5f;
14 | private final float mFrom;
15 |
16 | public ScaleInAnimation() {
17 | this(DEFAULT_SCALE_FROM);
18 | }
19 |
20 | public ScaleInAnimation(float from) {
21 | mFrom = from;
22 | }
23 |
24 | @Override
25 | public Animator[] getAnimators(View view) {
26 | ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", mFrom, 1f);
27 | ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", mFrom, 1f);
28 | return new ObjectAnimator[] { scaleX, scaleY };
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/SlideInBottomAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 |
8 | /**
9 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
10 | */
11 | public class SlideInBottomAnimation implements BaseAnimation {
12 |
13 |
14 |
15 | @Override
16 | public Animator[] getAnimators(View view) {
17 | return new Animator[]{
18 | ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0)
19 | };
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/SlideInLeftAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 |
8 | /**
9 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
10 | */
11 | public class SlideInLeftAnimation implements BaseAnimation {
12 |
13 |
14 | @Override
15 | public Animator[] getAnimators(View view) {
16 | return new Animator[] {
17 | ObjectAnimator.ofFloat(view, "translationX", -view.getRootView().getWidth(), 0)
18 | };
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/animation/SlideInRightAnimation.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.animation;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 |
8 | /**
9 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
10 | */
11 | public class SlideInRightAnimation implements BaseAnimation {
12 |
13 |
14 | @Override
15 | public Animator[] getAnimators(View view) {
16 | return new Animator[]{
17 | ObjectAnimator.ofFloat(view, "translationX", view.getRootView().getWidth(), 0)
18 | };
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/callback/ItemDragAndSwipeCallback.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.callback;
2 |
3 | import android.graphics.Canvas;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.support.v7.widget.helper.ItemTouchHelper;
6 | import android.view.View;
7 |
8 | import com.chad.library.R;
9 | import com.chad.library.adapter.base.BaseItemDraggableAdapter;
10 |
11 | /**
12 | * Created by luoxw on 2016/6/20.
13 | */
14 | public class ItemDragAndSwipeCallback extends ItemTouchHelper.Callback {
15 |
16 | // private static final String TAG = ItemDragAndSwipeCallback.class.getSimpleName();
17 |
18 | BaseItemDraggableAdapter mAdapter;
19 |
20 | float mMoveThreshold = 0.1f;
21 | float mSwipeThreshold = 0.7f;
22 |
23 | int mDragMoveFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
24 | int mSwipeMoveFlags = ItemTouchHelper.END;
25 |
26 | public ItemDragAndSwipeCallback(BaseItemDraggableAdapter adapter) {
27 | mAdapter = adapter;
28 | }
29 |
30 | @Override
31 | public boolean isLongPressDragEnabled() {
32 | return false;
33 | }
34 |
35 | @Override
36 | public boolean isItemViewSwipeEnabled() {
37 | return mAdapter.isItemSwipeEnable();
38 | }
39 |
40 | @Override
41 | public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
42 | if (actionState == ItemTouchHelper.ACTION_STATE_DRAG
43 | && !isViewCreateByAdapter(viewHolder)) {
44 | mAdapter.onItemDragStart(viewHolder);
45 | viewHolder.itemView.setTag(R.id.BaseQuickAdapter_dragging_support, true);
46 | } else if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE
47 | && !isViewCreateByAdapter(viewHolder)) {
48 | mAdapter.onItemSwipeStart(viewHolder);
49 | viewHolder.itemView.setTag(R.id.BaseQuickAdapter_swiping_support, true);
50 | }
51 | super.onSelectedChanged(viewHolder, actionState);
52 | }
53 |
54 | @Override
55 | public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
56 | super.clearView(recyclerView, viewHolder);
57 | if (isViewCreateByAdapter(viewHolder)) {
58 | return;
59 | }
60 |
61 | if (viewHolder.itemView.getTag(R.id.BaseQuickAdapter_dragging_support) != null
62 | && (Boolean)viewHolder.itemView.getTag(R.id.BaseQuickAdapter_dragging_support)) {
63 | mAdapter.onItemDragEnd(viewHolder);
64 | viewHolder.itemView.setTag(R.id.BaseQuickAdapter_dragging_support, false);
65 | }
66 | if (viewHolder.itemView.getTag(R.id.BaseQuickAdapter_swiping_support) != null
67 | && (Boolean)viewHolder.itemView.getTag(R.id.BaseQuickAdapter_swiping_support)) {
68 | mAdapter.onItemSwipeClear(viewHolder);
69 | viewHolder.itemView.setTag(R.id.BaseQuickAdapter_swiping_support, false);
70 | }
71 | }
72 |
73 | @Override
74 | public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
75 | if (isViewCreateByAdapter(viewHolder)) {
76 | return makeMovementFlags(0, 0);
77 | }
78 |
79 | return makeMovementFlags(mDragMoveFlags, mSwipeMoveFlags);
80 | }
81 |
82 | @Override
83 | public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
84 | if (source.getItemViewType() != target.getItemViewType()) {
85 | return false;
86 | } else {
87 | return true;
88 | }
89 | }
90 |
91 | @Override
92 | public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder source, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
93 | super.onMoved(recyclerView, source, fromPos, target, toPos, x, y);
94 | mAdapter.onItemDragMoving(source, target);
95 | }
96 |
97 | @Override
98 | public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
99 | if (!isViewCreateByAdapter(viewHolder)) {
100 | mAdapter.onItemSwiped(viewHolder);
101 | }
102 | }
103 |
104 | @Override
105 | public float getMoveThreshold(RecyclerView.ViewHolder viewHolder) {
106 | return mMoveThreshold;
107 | }
108 |
109 | @Override
110 | public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
111 | return mSwipeThreshold;
112 | }
113 |
114 | /**
115 | * Set the fraction that the user should move the View to be considered as swiped.
116 | * The fraction is calculated with respect to RecyclerView's bounds.
117 | *
118 | * Default value is .5f, which means, to swipe a View, user must move the View at least
119 | * half of RecyclerView's width or height, depending on the swipe direction.
120 | *
121 | * @param swipeThreshold A float value that denotes the fraction of the View size. Default value
122 | * is .8f .
123 | */
124 | public void setSwipeThreshold(float swipeThreshold) {
125 | mSwipeThreshold = swipeThreshold;
126 | }
127 |
128 |
129 | /**
130 | * Set the fraction that the user should move the View to be considered as it is
131 | * dragged. After a view is moved this amount, ItemTouchHelper starts checking for Views
132 | * below it for a possible drop.
133 | *
134 | * @param moveThreshold A float value that denotes the fraction of the View size. Default value is
135 | * .1f .
136 | */
137 | public void setMoveThreshold(float moveThreshold) {
138 | mMoveThreshold = moveThreshold;
139 | }
140 |
141 | /**
142 | *
Set the drag movement direction.
143 | * The value should be ItemTouchHelper.UP, ItemTouchHelper.DOWN, ItemTouchHelper.LEFT, ItemTouchHelper.RIGHT or their combination.
144 | * You can combine them like ItemTouchHelper.UP | ItemTouchHelper.DOWN, it means that the item could only move up and down when dragged.
145 | * @param dragMoveFlags the drag movement direction. Default value is ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT.
146 | */
147 | public void setDragMoveFlags(int dragMoveFlags) {
148 | mDragMoveFlags = dragMoveFlags;
149 | }
150 |
151 | /**
152 | * Set the swipe movement direction.
153 | * The value should be ItemTouchHelper.START, ItemTouchHelper.END or their combination.
154 | * You can combine them like ItemTouchHelper.START | ItemTouchHelper.END, it means that the item could swipe to both left or right.
155 | * @param swipeMoveFlags the swipe movement direction. Default value is ItemTouchHelper.END.
156 | */
157 | public void setSwipeMoveFlags(int swipeMoveFlags) {
158 | mSwipeMoveFlags = swipeMoveFlags;
159 | }
160 |
161 | @Override
162 | public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
163 | float dX, float dY, int actionState, boolean isCurrentlyActive) {
164 | super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
165 |
166 | if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE
167 | && !isViewCreateByAdapter(viewHolder)) {
168 | View itemView = viewHolder.itemView;
169 |
170 | c.save();
171 | if (dX > 0) {
172 | c.clipRect(itemView.getLeft(), itemView.getTop(),
173 | itemView.getLeft() + dX, itemView.getBottom());
174 | c.translate(itemView.getLeft(), itemView.getTop());
175 | } else {
176 | c.clipRect(itemView.getRight() + dX, itemView.getTop(),
177 | itemView.getRight(), itemView.getBottom());
178 | c.translate(itemView.getRight() + dX, itemView.getTop());
179 | }
180 |
181 | mAdapter.onItemSwiping(c, viewHolder, dX, dY, isCurrentlyActive);
182 | c.restore();
183 |
184 | }
185 | }
186 |
187 | private boolean isViewCreateByAdapter(RecyclerView.ViewHolder viewHolder) {
188 | int type = viewHolder.getItemViewType();
189 | if (type == mAdapter.HEADER_VIEW || type == mAdapter.LOADING_VIEW
190 | || type == mAdapter.FOOTER_VIEW || type == mAdapter.EMPTY_VIEW) {
191 | return true;
192 | }
193 | return false;
194 |
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/entity/AbstractExpandableItem.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.entity;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * A helper to implement expandable item.
8 | * if you don't want to extent a class, you can also implement the interface IExpandable
9 | * Created by luoxw on 2016/8/9.
10 | */
11 | public abstract class AbstractExpandableItem implements IExpandable {
12 | protected boolean mExpandable = false;
13 | protected List mSubItems;
14 |
15 | @Override
16 | public boolean isExpanded() {
17 | return mExpandable;
18 | }
19 |
20 | @Override
21 | public void setExpanded(boolean expanded) {
22 | mExpandable = expanded;
23 | }
24 |
25 | @Override
26 | public List getSubItems() {
27 | return mSubItems;
28 | }
29 |
30 | public boolean hasSubItem() {
31 | return mSubItems != null && mSubItems.size() > 0;
32 | }
33 |
34 | public void setSubItems(List list) {
35 | mSubItems = list;
36 | }
37 |
38 | public T getSubItem(int position) {
39 | if (hasSubItem() && position < mSubItems.size()) {
40 | return mSubItems.get(position);
41 | } else {
42 | return null;
43 | }
44 | }
45 |
46 | public int getSubItemPosition(T subItem) {
47 | return mSubItems != null ? mSubItems.indexOf(subItem) : -1;
48 | }
49 |
50 | public void addSubItem(T subItem) {
51 | if (mSubItems == null) {
52 | mSubItems = new ArrayList<>();
53 | }
54 | mSubItems.add(subItem);
55 | }
56 |
57 | public void addSubItem(int position, T subItem) {
58 | if (mSubItems != null && position >= 0 && position < mSubItems.size()) {
59 | mSubItems.add(position, subItem);
60 | } else {
61 | addSubItem(subItem);
62 | }
63 | }
64 |
65 | public boolean contains(T subItem) {
66 | return mSubItems != null && mSubItems.contains(subItem);
67 | }
68 |
69 | public boolean removeSubItem(T subItem) {
70 | return mSubItems != null && mSubItems.remove(subItem);
71 | }
72 |
73 | public boolean removeSubItem(int position) {
74 | if (mSubItems != null && position >= 0 && position < mSubItems.size()) {
75 | mSubItems.remove(position);
76 | return true;
77 | }
78 | return false;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/entity/IExpandable.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.entity;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * implement the interface if the item is expandable
7 | * Created by luoxw on 2016/8/8.
8 | */
9 | public interface IExpandable {
10 | boolean isExpanded();
11 | void setExpanded(boolean expanded);
12 | List getSubItems();
13 |
14 | /**
15 | * Get the level of this item. The level start from 0.
16 | * If you don't care about the level, just return a negative.
17 | */
18 | int getLevel();
19 | }
20 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/entity/MultiItemEntity.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.entity;
2 |
3 | /**
4 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
5 | */
6 | public interface MultiItemEntity {
7 |
8 | int getItemType();
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/entity/SectionEntity.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.entity;
2 |
3 | /**
4 | * https://github.com/CymChad/BaseRecyclerViewAdapterHelper
5 | */
6 | public abstract class SectionEntity {
7 | public boolean isHeader;
8 | public T t;
9 | public String header;
10 |
11 | public SectionEntity(boolean isHeader, String header) {
12 | this.isHeader = isHeader;
13 | this.header = header;
14 | this.t = null;
15 | }
16 |
17 | public SectionEntity(T t) {
18 | this.isHeader = false;
19 | this.header = null;
20 | this.t = t;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemChildClickListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.view.View;
4 |
5 | import com.chad.library.adapter.base.BaseQuickAdapter;
6 |
7 | /**
8 | * Created by AllenCoder on 2016/8/03.
9 | * A convenience class to extend when you only want to OnItemChildClickListener for a subset
10 | * of all the SimpleClickListener. This implements all methods in the
11 | * {@link SimpleClickListener}
12 | **/
13 |
14 | public abstract class OnItemChildClickListener extends SimpleClickListener {
15 |
16 | @Override
17 | public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
18 |
19 | }
20 |
21 | @Override
22 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
23 |
24 | }
25 |
26 | @Override
27 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
28 | onSimpleItemChildClick(adapter, view, position);
29 | }
30 |
31 | @Override
32 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
33 |
34 | }
35 |
36 | public abstract void onSimpleItemChildClick(BaseQuickAdapter adapter, View view, int position);
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemChildLongClickListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.view.View;
4 |
5 | import com.chad.library.adapter.base.BaseQuickAdapter;
6 |
7 | /**
8 | * Created by AllenCoder on 2016/8/03.
9 | * A convenience class to extend when you only want to OnItemChildLongClickListener for a subset
10 | * of all the SimpleClickListener. This implements all methods in the
11 | * {@link SimpleClickListener}
12 | **/
13 | public abstract class OnItemChildLongClickListener extends SimpleClickListener {
14 |
15 |
16 | @Override
17 | public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
18 |
19 | }
20 |
21 | @Override
22 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
23 |
24 | }
25 |
26 | @Override
27 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
28 |
29 | }
30 |
31 | @Override
32 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
33 | onSimpleItemChildLongClick(adapter,view,position);
34 | }
35 | public abstract void onSimpleItemChildLongClick(BaseQuickAdapter adapter, View view, int position);
36 | }
37 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.view.View;
4 |
5 | import com.chad.library.adapter.base.BaseQuickAdapter;
6 |
7 | /**
8 | * Created by AllenCoder on 2016/8/03.
9 | *
10 | *
11 | * A convenience class to extend when you only want to OnItemClickListener for a subset
12 | * of all the SimpleClickListener. This implements all methods in the
13 | * {@link SimpleClickListener}
14 | */
15 | public abstract class OnItemClickListener extends SimpleClickListener {
16 |
17 |
18 | @Override
19 | public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
20 | onSimpleItemClick(adapter,view,position);
21 | }
22 |
23 | @Override
24 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
25 |
26 | }
27 |
28 | @Override
29 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
30 |
31 | }
32 |
33 | @Override
34 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
35 |
36 | }
37 | public abstract void onSimpleItemClick(BaseQuickAdapter adapter, View view, int position);
38 | }
39 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemDragListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 |
5 | /**
6 | * Created by luoxw on 2016/6/20.
7 | */
8 | public interface OnItemDragListener {
9 | void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos);
10 | void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to);
11 | void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos);
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemLongClickListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.view.View;
4 |
5 | import com.chad.library.adapter.base.BaseQuickAdapter;
6 |
7 | /**
8 | * create by: allen on 16/8/3.
9 | */
10 |
11 | public abstract class OnItemLongClickListener extends SimpleClickListener {
12 |
13 |
14 |
15 |
16 | @Override
17 | public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
18 |
19 | }
20 |
21 | @Override
22 | public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
23 | onSimpleItemLongClick( adapter, view, position);
24 | }
25 |
26 | @Override
27 | public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
28 |
29 | }
30 |
31 | @Override
32 | public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
33 | }
34 | public abstract void onSimpleItemLongClick(BaseQuickAdapter adapter, View view, int position);
35 | }
36 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/listener/OnItemSwipeListener.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.listener;
2 |
3 | import android.graphics.Canvas;
4 | import android.support.v7.widget.RecyclerView;
5 |
6 | /**
7 | * Created by luoxw on 2016/6/23.
8 | */
9 | public interface OnItemSwipeListener {
10 |
11 | /**
12 | * Called when the swipe action start.
13 | */
14 | void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos);
15 |
16 | /**
17 | * Called when the swipe action is over.
18 | * If you change the view on the start, you should reset is here, no matter the item has swiped or not.
19 | * @param pos If the view is swiped, pos will be negative.
20 | */
21 | void clearView(RecyclerView.ViewHolder viewHolder, int pos);
22 | /**
23 | * Called when item is swiped, the view is going to be removed from the adapter.
24 | */
25 | void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos);
26 |
27 | /**
28 | * Draw on the empty edge when swipe moving
29 | * @param canvas the empty edge's canvas
30 | * @param viewHolder The ViewHolder which is being interacted by the User or it was
31 | * interacted and simply animating to its original position
32 | * @param dX The amount of horizontal displacement caused by user's action
33 | * @param dY The amount of vertical displacement caused by user's action
34 | * @param isCurrentlyActive True if this view is currently being controlled by the user or
35 | * false it is simply animating back to its original state.
36 | */
37 | void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive);
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/loadmore/LoadMoreView.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.loadmore;
2 |
3 | import android.support.annotation.IdRes;
4 | import android.support.annotation.LayoutRes;
5 |
6 | import com.chad.library.adapter.base.BaseQuickAdapter;
7 | import com.chad.library.adapter.base.BaseViewHolder;
8 |
9 | /**
10 | * Created by BlingBling on 2016/11/11.
11 | */
12 |
13 | public abstract class LoadMoreView {
14 |
15 | public static final int STATUS_DEFAULT = 1;
16 | public static final int STATUS_LOADING = 2;
17 | public static final int STATUS_FAIL = 3;
18 | public static final int STATUS_END = 4;
19 |
20 | private int mLoadMoreStatus = STATUS_DEFAULT;
21 | private boolean mLoadMoreEndGone = false;
22 |
23 | public void setLoadMoreStatus(int loadMoreStatus) {
24 | this.mLoadMoreStatus = loadMoreStatus;
25 | }
26 |
27 | public int getLoadMoreStatus() {
28 | return mLoadMoreStatus;
29 | }
30 |
31 | public void convert(BaseViewHolder holder) {
32 | switch (mLoadMoreStatus) {
33 | case STATUS_LOADING:
34 | visibleLoading(holder, true);
35 | visibleLoadFail(holder, false);
36 | visibleLoadEnd(holder, false);
37 | break;
38 | case STATUS_FAIL:
39 | visibleLoading(holder, false);
40 | visibleLoadFail(holder, true);
41 | visibleLoadEnd(holder, false);
42 | break;
43 | case STATUS_END:
44 | visibleLoading(holder, false);
45 | visibleLoadFail(holder, false);
46 | visibleLoadEnd(holder, true);
47 | break;
48 | }
49 | }
50 |
51 | private void visibleLoading(BaseViewHolder holder, boolean visible) {
52 | holder.setVisible(getLoadingViewId(), visible);
53 | }
54 |
55 | private void visibleLoadFail(BaseViewHolder holder, boolean visible) {
56 | holder.setVisible(getLoadFailViewId(), visible);
57 | }
58 |
59 | private void visibleLoadEnd(BaseViewHolder holder, boolean visible) {
60 | final int loadEndViewId=getLoadEndViewId();
61 | if (loadEndViewId != 0) {
62 | holder.setVisible(loadEndViewId, visible);
63 | }
64 | }
65 |
66 | public final void setLoadMoreEndGone(boolean loadMoreEndGone) {
67 | this.mLoadMoreEndGone = loadMoreEndGone;
68 | }
69 |
70 | public final boolean isLoadEndMoreGone(){
71 | if(getLoadEndViewId()==0){
72 | return true;
73 | }
74 | return mLoadMoreEndGone;}
75 |
76 | /**
77 | * No more data is hidden
78 | * @return true for no more data hidden load more
79 | * @deprecated Use {@link BaseQuickAdapter#loadMoreEnd(boolean)} instead.
80 | */
81 | @Deprecated
82 | public boolean isLoadEndGone(){return mLoadMoreEndGone;}
83 |
84 | /**
85 | * load more layout
86 | *
87 | * @return
88 | */
89 | public abstract @LayoutRes int getLayoutId();
90 |
91 | /**
92 | * loading view
93 | *
94 | * @return
95 | */
96 | protected abstract @IdRes int getLoadingViewId();
97 |
98 | /**
99 | * load fail view
100 | *
101 | * @return
102 | */
103 | protected abstract @IdRes int getLoadFailViewId();
104 |
105 | /**
106 | * load end view, you can return 0
107 | *
108 | * @return
109 | */
110 | protected abstract @IdRes int getLoadEndViewId();
111 | }
112 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/loadmore/SimpleLoadMoreView.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.loadmore;
2 |
3 |
4 | import com.chad.library.R;
5 |
6 | /**
7 | * Created by BlingBling on 2016/10/11.
8 | */
9 |
10 | public final class SimpleLoadMoreView extends LoadMoreView {
11 |
12 | @Override public int getLayoutId() {
13 | return R.layout.quick_view_load_more;
14 | }
15 |
16 | @Override protected int getLoadingViewId() {
17 | return R.id.load_more_loading_view;
18 | }
19 |
20 | @Override protected int getLoadFailViewId() {
21 | return R.id.load_more_load_fail_view;
22 | }
23 |
24 | @Override protected int getLoadEndViewId() {
25 | return R.id.load_more_load_end_view;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/library/src/main/java/com/chad/library/adapter/base/util/TouchEventUtil.java:
--------------------------------------------------------------------------------
1 | package com.chad.library.adapter.base.util;
2 |
3 | import android.view.MotionEvent;
4 |
5 | public class TouchEventUtil {
6 |
7 | public static String getTouchAction(int actionId) {
8 | String actionName = "Unknow:id=" + actionId;
9 | switch (actionId) {
10 | case MotionEvent.ACTION_DOWN:
11 | actionName = "ACTION_DOWN";
12 | break;
13 | case MotionEvent.ACTION_MOVE:
14 | actionName = "ACTION_MOVE";
15 | break;
16 | case MotionEvent.ACTION_UP:
17 | actionName = "ACTION_UP";
18 | break;
19 | case MotionEvent.ACTION_CANCEL:
20 | actionName = "ACTION_CANCEL";
21 | break;
22 | case MotionEvent.ACTION_OUTSIDE:
23 | actionName = "ACTION_OUTSIDE";
24 | break;
25 | }
26 | return actionName;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/library/src/main/res/drawable/sample_footer_loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/library/src/main/res/drawable/sample_footer_loading.png
--------------------------------------------------------------------------------
/library/src/main/res/drawable/sample_footer_loading_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/library/src/main/res/layout/quick_view_load_more.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
29 |
30 |
31 |
36 |
37 |
38 |
44 |
45 |
46 |
47 |
52 |
53 |
59 |
60 |
--------------------------------------------------------------------------------
/library/src/main/res/values-en/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Loading...
3 | load more failed
4 | No more data
5 |
6 |
--------------------------------------------------------------------------------
/library/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 50dp
6 | 50dp
7 | 6dp
8 |
9 | 0.66dp
10 | 4dp
11 | 10dp
12 | 14dp
13 | 22dp
14 | 36dp
15 | 40dp
16 | 60dp
17 | 72dp
18 |
19 | 12sp
20 | 14sp
21 | 16sp
22 |
23 |
--------------------------------------------------------------------------------
/library/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/library/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Library
3 | 正在加载中...
4 | 加载失败,请点我重试
5 | 没有更多数据
6 |
7 |
--------------------------------------------------------------------------------
/mylibrary/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/mylibrary/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion '25.0.2'
6 |
7 | defaultConfig {
8 | minSdkVersion 14
9 | targetSdkVersion 25
10 | versionCode 1
11 | versionName "1.0"
12 |
13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
14 |
15 | }
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 | }
23 |
24 | dependencies {
25 | compile fileTree(include: ['*.jar'], dir: 'libs')
26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
27 | exclude group: 'com.android.support', module: 'support-annotations'
28 | })
29 | compile 'com.android.support:appcompat-v7:25.1.0'
30 | testCompile 'junit:junit:4.12'
31 | }
32 |
--------------------------------------------------------------------------------
/mylibrary/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Applications/Android-SDK/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/mylibrary/src/androidTest/java/com/allen/mylibrary/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.allen.mylibrary;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumentation test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.allen.mylibrary.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/mylibrary/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/mylibrary/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | My Library
3 |
4 |
--------------------------------------------------------------------------------
/mylibrary/src/test/java/com/allen/mylibrary/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.allen.mylibrary;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/recyclerview.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AllenCoder/Recyclerview/0daaf59b873c544824e90a3837282b62a2f71176/recyclerview.jks
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':app-release', ':mylibrary', ':library-release',":library"
2 |
--------------------------------------------------------------------------------