Skip to content

Commit 59a925f

Browse files
committed
RecyclerView 和 ListView 使用对比分析
1 parent f53d801 commit 59a925f

File tree

7 files changed

+459
-6
lines changed

7 files changed

+459
-6
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
本代码库整理总结 Android 系统自身UI特性,主要包含**代码实践****特性总结**两方面的内容。有兴趣的朋友欢迎fork、star、watch。
44

5-
## 最新更新 (最后编辑于 2016-07-29
5+
## 最新更新 (最后编辑于 2016-08-08
66

7-
- 新增 Material Design 系列控件的体验,其中包括 RecyclerView、SnackBar、FloatingActionButton、AppBarLayout、CardView、CoordinatorLayout、CollapsingToolbarLayout、BottomSheets 等
8-
- 写一点个人感想,Android L 之后,嵌套滚动机制的应用越发重要了都。。。。。。。。
7+
- 新增 RecyclerView 和 ListView 使用对比分析
98

109
## 实践总结
1110

1211
- [Translucent System Bar 的最佳实践](note/00_AndroidSystemUI:TranslucentBar特性的使用.md)
1312
- [最详细的 Toolbar 开发实践总结](note/01_AndroidSystemUI:ToolBar特性的使用.md)
1413
- [最详细的 NavigationDrawer 开发实践总结](note/02_AndroidSystemUI:NavigationDrawe特性的使用.md)
14+
- [RecyclerView 和 ListView使用对比分析](note/03_AndroidSystemUI:RecyclerView和ListView使用对比分析.md)
1515

1616
## 参考文章
1717

note/03_AndroidSystemUI:RecyclerView和ListView使用对比分析.md

Lines changed: 347 additions & 0 deletions
Large diffs are not rendered by default.

note/03_AndroidSystemUI:当ListView遇上RecyclerView.md

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/main/java/com/clock/systemui/activity/recycler/RecyclerDemoActivity.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import android.support.v7.widget.LinearLayoutManager;
77
import android.support.v7.widget.RecyclerView;
88
import android.support.v7.widget.StaggeredGridLayoutManager;
9+
import android.support.v7.widget.helper.ItemTouchHelper;
910
import android.view.Menu;
1011
import android.view.MenuInflater;
1112
import android.view.MenuItem;
13+
import android.view.MotionEvent;
1214

1315
import com.clock.systemui.R;
1416
import com.clock.systemui.adapter.AuthorRecyclerAdapter;
@@ -69,6 +71,21 @@ public boolean onOptionsItemSelected(MenuItem item) {
6971
} else if (itemId == R.id.delete_item) {
7072
mRecyclerAdapter.notifyItemChanged(3);
7173

74+
} else if (itemId == R.id.update_item) {
75+
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
76+
if (layoutManager instanceof LinearLayoutManager) {
77+
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
78+
int position = linearLayoutManager.findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item的位置
79+
if (RecyclerView.NO_POSITION != position) {
80+
AuthorInfo authorInfo = mAuthorInfoList.get(position);
81+
authorInfo.setNickName("Android");
82+
authorInfo.setMotto("I am Android Man!");
83+
authorInfo.setPortrait(R.mipmap.ic_launcher);
84+
mRecyclerAdapter.notifyItemChanged(position);
85+
}
86+
87+
}
88+
7289
}
7390
return super.onOptionsItemSelected(item);
7491
}
@@ -101,5 +118,68 @@ private void initView() {
101118
mRecyclerView.setLayoutManager(linearLayoutManager);
102119
mRecyclerAdapter.setSmallType(false);
103120
mRecyclerView.setAdapter(mRecyclerAdapter);
121+
//ItemTouchHelper 用于实现 RecyclerView Item 拖曳效果的类
122+
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
123+
124+
@Override
125+
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
126+
//actionState : action状态类型,有三类 ACTION_STATE_DRAG (拖曳),ACTION_STATE_SWIPE(滑动),ACTION_STATE_IDLE(静止)
127+
int dragFlags = makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN
128+
| ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//支持上下左右的拖曳
129+
int swipeFlags = makeMovementFlags(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//表示支持左右的滑动
130+
return makeMovementFlags(dragFlags, swipeFlags);//直接返回0表示不支持拖曳和滑动
131+
}
132+
133+
/**
134+
* @param recyclerView attach的RecyclerView
135+
* @param viewHolder 拖动的Item
136+
* @param target 放置Item的目标位置
137+
* @return
138+
*/
139+
@Override
140+
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
141+
int fromPosition = viewHolder.getAdapterPosition();//要拖曳的位置
142+
int toPosition = target.getAdapterPosition();//要放置的目标位置
143+
mRecyclerAdapter.moveItem(fromPosition, toPosition);
144+
return true;
145+
}
146+
147+
/**
148+
* @param viewHolder 滑动移除的Item
149+
* @param direction
150+
*/
151+
@Override
152+
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
153+
int position = viewHolder.getAdapterPosition();//获取要滑动删除的Item位置
154+
mRecyclerAdapter.removeItem(position);
155+
}
156+
157+
@Override
158+
public boolean isLongPressDragEnabled() {
159+
return super.isLongPressDragEnabled();//不支持长按拖曳效果直接返回false
160+
}
161+
162+
@Override
163+
public boolean isItemViewSwipeEnabled() {
164+
return super.isItemViewSwipeEnabled();//不支持滑动效果直接返回false
165+
}
166+
});
167+
itemTouchHelper.attachToRecyclerView(mRecyclerView);
168+
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
169+
@Override
170+
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
171+
return false;
172+
}
173+
174+
@Override
175+
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
176+
177+
}
178+
179+
@Override
180+
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
181+
182+
}
183+
});
104184
}
105185
}

src/main/java/com/clock/systemui/adapter/AuthorListAdapter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.clock.systemui.adapter;
22

3+
import android.view.LayoutInflater;
34
import android.view.View;
45
import android.view.ViewGroup;
56
import android.widget.BaseAdapter;
@@ -49,7 +50,8 @@ public long getItemId(int position) {
4950
public View getView(int position, View convertView, ViewGroup parent) {
5051
ViewHolder viewHolder = null;
5152
if (convertView == null) {
52-
convertView = View.inflate(parent.getContext(), R.layout.author_info_layout, null);
53+
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
54+
convertView = inflater.inflate(R.layout.author_info_layout, parent, false);
5355
viewHolder = new ViewHolder();
5456
viewHolder.mPortrait = (ImageView) convertView.findViewById(R.id.iv_portrait);
5557
viewHolder.mNickName = (TextView) convertView.findViewById(R.id.tv_nickname);

src/main/java/com/clock/systemui/adapter/AuthorRecyclerAdapter.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.clock.systemui.R;
1111
import com.clock.systemui.bean.AuthorInfo;
1212

13+
import java.util.Collections;
1314
import java.util.List;
1415

1516
/**
@@ -62,6 +63,27 @@ public int getItemCount() {
6263
return mAuthorInfoList.size();
6364
}
6465

66+
/**
67+
* 移动Item
68+
*
69+
* @param fromPosition
70+
* @param toPosition
71+
*/
72+
public void moveItem(int fromPosition, int toPosition) {
73+
Collections.swap(mAuthorInfoList, fromPosition, toPosition);//做数据的交换
74+
notifyItemMoved(fromPosition, toPosition);
75+
}
76+
77+
/**
78+
* 滑动Item
79+
*
80+
* @param position
81+
*/
82+
public void removeItem(int position) {
83+
mAuthorInfoList.remove(position);//删除数据
84+
notifyItemRemoved(position);
85+
}
86+
6587
class AuthorViewHolder extends RecyclerView.ViewHolder {
6688

6789
ImageView mPortraitView;

src/main/res/menu/recyclerview_option.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@
2020
<item
2121
android:id="@+id/delete_item"
2222
android:title="删一条" />
23+
24+
<item
25+
android:id="@+id/update_item"
26+
android:title="局部刷新" />
2327
</menu>

0 commit comments

Comments
 (0)