慕课网
导入包后,mainactivity的xml布局
<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:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </RelativeLayout>MainAciticity的代码
public class MainActivity extends ActionBarActivity { private RecyclerView mRecycler; private List<String> mData; private SimpleAdapterRecycler simpleAdapterRecycler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); simpleAdapterRecycler = new SimpleAdapterRecycler(this, mData); mRecycler.setAdapter(simpleAdapterRecycler); //设置recyclerView显示的样式 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mRecycler.setLayoutManager(linearLayoutManager); } private void initView() { mRecycler = (RecyclerView) findViewById(R.id.recycler); } private void initData() { mData = new ArrayList<String>(); for (int i = 'A'; i < 'Z'; i++) { mData.add("" + (char) i); } } }它的adapter,记住这个MyAdapter!!!
public class SimpleAdapterRecycler extends RecyclerView.Adapter<SimpleAdapterRecycler.MyViewHolder> { private Context context; private List<String> mData; private LayoutInflater mInflater; public SimpleAdapterRecycler(Context context, List<String> mData) { this.context = context; this.mData = mData; this.mInflater = LayoutInflater.from(context); } @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = mInflater.inflate(R.layout.item_single, viewGroup, false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(MyViewHolder viewHolder, int i) { viewHolder.t.setText(mData.get(i)); } @Override public int getItemCount() { return mData.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView t; public MyViewHolder(View itemView) { super(itemView); t = (TextView) itemView.findViewById(R.id.item_tv); } } }item的布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="72dp" android:background="#44ff0000"> <TextView android:id="@+id/item_tv" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
到此显示的使一个无分割线的listview的recyclerview,下面加分割线,加其他类型的布局
//给其设置分割线 DividerLine dividerLine = new DividerLine(DividerLine.VERTICAL); dividerLine.setSize(1); dividerLine.setColor(0xFF00ff00); mRecycler.addItemDecoration(dividerLine);
/** * 分隔线装饰 */ public class DividerLine extends RecyclerView.ItemDecoration { /** * 水平方向 */ public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL; /** * 垂直方向 */ public static final int VERTICAL = LinearLayoutManager.VERTICAL; // 画笔 private Paint paint; // 布局方向 private int orientation; // 分割线颜色 private int color; // 分割线尺寸 private int size; public DividerLine() { this(VERTICAL); } public DividerLine(int orientation) { this.orientation = orientation; paint = new Paint(); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); if (orientation == VERTICAL) { drawHorizontal(c, parent); } else { drawVertical(c, parent); } } /** * 设置分割线颜色 * * @param color 颜色 */ public void setColor(int color) { this.color = color; paint.setColor(color); } /** * 设置分割线尺寸 * * @param size 尺寸 */ public void setSize(int size) { this.size = size; } // 绘制垂直分割线 protected void drawVertical(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + size; c.drawRect(left, top, right, bottom, paint); } } // 绘制水平分割线 protected void drawHorizontal(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + size; c.drawRect(left, top, right, bottom, paint); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.action_listview: mRecycler.setLayoutManager(new LinearLayoutManager(this)); break; case R.id.action_gridview: mRecycler.setLayoutManager(new GridLayoutManager(this,3)); break; case R.id.horizonGridview: mRecycler.setLayoutManager(new StaggeredGridLayoutManager(5,StaggeredGridLayoutManager.HORIZONTAL)); break; case R.id.action_staggered: break; } return true; } }menu布局
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" app:showAsAction="never" /> <item android:id="@+id/action_listview" android:orderInCategory="100" android:title="action_listview" app:showAsAction="never" /> <item android:id="@+id/action_gridview" android:orderInCategory="100" android:title="action_gridview" app:showAsAction="never" /> <item android:id="@+id/horizonGridview" android:orderInCategory="100" android:title="horizonGridview" app:showAsAction="never" /> <item android:id="@+id/action_staggered" android:orderInCategory="100" android:title="action_staggered" app:showAsAction="never" /> </menu>把mainactivity跟adapter各复制一份用于演示瀑布流。点击菜单键的瀑布流跳转另一个activity
在新adapter中初始化一些随机高度
private List<Integer> mHeights;
mHeights = new ArrayList<Integer>(); for(int i = 0;i<mData.size();i++) { mHeights.add((int) (100 + Math.random() * 300)); }在onbindviewholder中把view的高度重新设置
ViewGroup.LayoutParams lp = viewHolder.itemView.getLayoutParams(); lp.height = mHeights.get(i); viewHolder.itemView.setLayoutParams(lp);