RecyclerView中提供了三種佈局管理器,分別是:
- LinearLayoutManager(線性佈局,類似ListView)
- GridLayoutManager(網格佈局)
- StaggeredGridLayoutManager(瀑布流佈局)
Gradle:
compile 'com.android.support:recyclerview-v7:23.1.0'
Layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
MainActivity:
mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView); mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3)); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter = new MyRecyclerAdapter(this,lists); mRecyclerView.setAdapter(adapter);取得RecylerView物件,設定佈局及adapter。
線性佈局:mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
網格佈局:mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
瀑布流佈局(直向):mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL));
設定項目動畫為預設:mRecyclerView.setItemAnimator(new DefaultItemAnimator());
MyRecyclerAdapter:
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> { private ListonBindViewHolder:當物件顯示於畫面時被調用,可利用此方法更新該物件之內容。lists; private Context context; private List heights; public MyRecyclerAdapter(Context context,List lists) { this.context = context; this.lists = lists; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.mTv.setText(lists.get(position)); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { lists.remove(holder.getLayoutPosition()); notifyItemRemoved(holder.getLayoutPosition()); return false; } }); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"Onclick:"+holder.getLayoutPosition(),Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return lists.size(); } } class MyViewHolder extends RecyclerView.ViewHolder{ TextView mTv; public MyViewHolder(View itemView) { super(itemView); mTv = (TextView) itemView.findViewById(R.id.textView); } }
※使用adapter.notifyDataSetChanged()會重新調用onBindViewHolder。
RecyclerView.Adapter 除了adapter.notifyDataSetChanged()之外還提供幾個函數使用。
notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemMoved(int, int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)
lists.add(postion,name); notifyItemInserted(postion);將資料插入postion位置,對postion做更新。
刪除:
lists.remove(position); notifyItemRemoved(position);
LinearLayoutManager |
GirdLayoutManager |
StaggeredGridLayoutManager |
Demo:
沒有留言:
張貼留言