原文:https://github.com/dyguests/RecyclerViewDemojava
RecyclerView是用於替換ListView的解決方案,將視圖控制和數據綁定作了分離,提供了強大的樣式定製能力android
在 module 的 build.gradle 中 加入 compile 'com.android.support:recyclerview-v7:23.3.0'
代碼:git
dependencies { ... compile 'com.android.support:recyclerview-v7:23.3.0'//1.1 ... }
activity_linear_layout_manager.xmlgithub
<RelativeLayout ...> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/item_linear"/> </RelativeLayout>
注:tools:listitem="@layout/item_linear"
是用於在Android Studio的Preview中查看效果用的ide
LinearLayoutManagerActivity.java佈局
mRecyclerView = ((RecyclerView) findViewById(R.id.recycler_view));
gradle
LayoutManager
(佈局方式)mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL/*方向*/, false/*是否反向*/ ));
注:這裏用LinearLayoutManager
表示這是使用線性佈局,也能夠使用GridLayoutManager
等.動畫
mAdapter = new LinearLayoutManagerAdapter(this); mRecyclerView.setAdapter(mAdapter);
... mAdapter.addItem(user); ...
也能夠使用ui
... mAdapter.addItems(users); ...
注:addItem()
,addItems()
方法是自定義的,主要是爲了把數據添加操做和動畫放在一塊兒.this
LinearLayoutManagerAdapter
類public class LinearLayoutManagerAdapter{ }
RecyclerView.Adapter
public class LinearLayoutManagerAdapter extends RecyclerView.Adapter{ }
RecyclerView.Adapter
是泛型類,須要一個繼承至RecyclerView.ViewHolder
的泛型參數(?),這裏咱們建立一個ViewHolder
的內部類:public class LinearLayoutManagerAdapter extends RecyclerView.Adapter{ public class ViewHolder extends RecyclerView.ViewHolder{ } }
public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{ public class ViewHolder extends RecyclerView.ViewHolder{ } }
public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(ViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } public class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); } } }
public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{ private final Context context; public LinearLayoutManagerAdapter(Context context) { this.context = context; } ... }
item_view
,注意這裏與ListView不一樣,這裏不返回View,而是返回ViewHolder(自已定義的).@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_linear, parent, false); return new ViewHolder(view); }
public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{ ... private final ArrayList<User> list; public LinearLayoutManagerAdapter(Context context) { this.context = context; list = new ArrayList<>(); } ... @Override public int getItemCount() { return list.size(); } ... }
list_item
與數據的綁定public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{ ... @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.bind(list.get(position)); } ... public class ViewHolder extends RecyclerView.ViewHolder{ ... public void bind(User data) { } } }
ViewHolder
中實現佈局元素的綁定與數據的綁定public class ViewHolder extends RecyclerView.ViewHolder { private final TextView mTextView; private User data; public ViewHolder(View itemView) { super(itemView); mTextView = ((TextView) itemView.findViewById(R.id.text_view)); } public void bind(User data) { mTextView.setText(data.getName()); this.data = data; } }
這裏注意一下,請儘可能把ViewHolder
相關的佈局元素綁定,數據綁定放到ViewHolder
中來實現,而不要放到onCreateViewHolder()
,onBindViewHolder()
中去實現.
//-----------------------數據增刪相關------------------------------- public void addItem(User item) { int positionStart = list.size(); list.add(item); notifyItemInserted(positionStart); } public void addItems(List<User> items) { int positionStart = list.size(); list.addAll(items); notifyItemRangeInserted(positionStart, items.size()); } public void clear() { int itemCount = list.size(); list.clear(); notifyItemRangeRemoved(0, itemCount); }
注:這段代碼是爲了方便把數據增刪和動畫效果綁定要一塊兒
LinearLayoutManagerActivity
GridLayoutManagerActivity
InContainerActivity