Skip to content

Commit

Permalink
RecyclerView 和 ListView 使用对比分析
Browse files Browse the repository at this point in the history
  • Loading branch information
D-clock committed Aug 7, 2016
1 parent f53d801 commit 59a925f
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 6 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

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

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

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

## 实践总结

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

## 参考文章

Expand Down
347 changes: 347 additions & 0 deletions note/03_AndroidSystemUI:RecyclerView和ListView使用对比分析.md

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions note/03_AndroidSystemUI:当ListView遇上RecyclerView.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;

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

} else if (itemId == R.id.update_item) {
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int position = linearLayoutManager.findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item的位置
if (RecyclerView.NO_POSITION != position) {
AuthorInfo authorInfo = mAuthorInfoList.get(position);
authorInfo.setNickName("Android");
authorInfo.setMotto("I am Android Man!");
authorInfo.setPortrait(R.mipmap.ic_launcher);
mRecyclerAdapter.notifyItemChanged(position);
}

}

}
return super.onOptionsItemSelected(item);
}
Expand Down Expand Up @@ -101,5 +118,68 @@ private void initView() {
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerAdapter.setSmallType(false);
mRecyclerView.setAdapter(mRecyclerAdapter);
//ItemTouchHelper 用于实现 RecyclerView Item 拖曳效果的类
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//actionState : action状态类型,有三类 ACTION_STATE_DRAG (拖曳),ACTION_STATE_SWIPE(滑动),ACTION_STATE_IDLE(静止)
int dragFlags = makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN
| ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//支持上下左右的拖曳
int swipeFlags = makeMovementFlags(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//表示支持左右的滑动
return makeMovementFlags(dragFlags, swipeFlags);//直接返回0表示不支持拖曳和滑动
}

/**
* @param recyclerView attach的RecyclerView
* @param viewHolder 拖动的Item
* @param target 放置Item的目标位置
* @return
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();//要拖曳的位置
int toPosition = target.getAdapterPosition();//要放置的目标位置
mRecyclerAdapter.moveItem(fromPosition, toPosition);
return true;
}

/**
* @param viewHolder 滑动移除的Item
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();//获取要滑动删除的Item位置
mRecyclerAdapter.removeItem(position);
}

@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();//不支持长按拖曳效果直接返回false
}

@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();//不支持滑动效果直接返回false
}
});
itemTouchHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}
});
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.clock.systemui.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
Expand Down Expand Up @@ -49,7 +50,8 @@ public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.author_info_layout, null);
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.author_info_layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.mPortrait = (ImageView) convertView.findViewById(R.id.iv_portrait);
viewHolder.mNickName = (TextView) convertView.findViewById(R.id.tv_nickname);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.clock.systemui.R;
import com.clock.systemui.bean.AuthorInfo;

import java.util.Collections;
import java.util.List;

/**
Expand Down Expand Up @@ -62,6 +63,27 @@ public int getItemCount() {
return mAuthorInfoList.size();
}

/**
* 移动Item
*
* @param fromPosition
* @param toPosition
*/
public void moveItem(int fromPosition, int toPosition) {
Collections.swap(mAuthorInfoList, fromPosition, toPosition);//做数据的交换
notifyItemMoved(fromPosition, toPosition);
}

/**
* 滑动Item
*
* @param position
*/
public void removeItem(int position) {
mAuthorInfoList.remove(position);//删除数据
notifyItemRemoved(position);
}

class AuthorViewHolder extends RecyclerView.ViewHolder {

ImageView mPortraitView;
Expand Down
4 changes: 4 additions & 0 deletions src/main/res/menu/recyclerview_option.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,8 @@
<item
android:id="@+id/delete_item"
android:title="删一条" />

<item
android:id="@+id/update_item"
android:title="局部刷新" />
</menu>

0 comments on commit 59a925f

Please sign in to comment.