效果图
layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.iamchan.recyc.MainActivity"> <ImageView android:src="@mipmap/ic_launcher" android:layout_width="match_parent" android:layout_height="150dp" /> <View android:background="#f5f5f5" android:layout_width="match_parent" android:layout_height="2dp"></View> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp"> <Button android:id="@+id/btn1" android:text="竖直" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <Button android:id="@+id/btn2" android:text="grid" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <Button android:id="@+id/btn3" android:text="瀑布" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recyc" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>
java
package com.example.iamchan.recyc; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private RecyclerView recyc; private List<String> stringList= Arrays.asList("a","b","c","d","e","f","g","h","i","j","k"); private Button btn1,btn2,btn3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyc= (RecyclerView) findViewById(R.id.recyc); btn1= (Button) findViewById(R.id.btn1); btn2= (Button) findViewById(R.id.btn2); btn3= (Button) findViewById(R.id.btn3); RecycAdapter recycAdapter=new RecycAdapter(this,stringList); recyc.setAdapter(recycAdapter); /* * * recyclerView能实现很多效果就是因为有这个布局管理器 xxxManager 设置方向xxxManager.setOrientation() * 1.设置布局管理器 * 2.方向 * 3.recyclerView加载布局管理器 * * * */ LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyc.setLayoutManager(linearLayoutManager); /* * * 接口回调方式设置监听事件 * * */ recycAdapter.setOnViewClickListener(new RecycAdapter.OnItemClickListener() { @Override public void onItemClickListener(int position) { Toast.makeText(MainActivity.this, "view"+position, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClickListener(int position) { Toast.makeText(MainActivity.this, "viewLong"+position, Toast.LENGTH_SHORT).show(); } @Override public void onTextClickListener(int position) { Toast.makeText(MainActivity.this, "text"+position, Toast.LENGTH_SHORT).show(); } @Override public void onTextLongClickListener(int position) { /*Toast.makeText(MainActivity.this, "textLong"+position, Toast.LENGTH_SHORT).show();*/ } }); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn1: LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyc.setLayoutManager(linearLayoutManager); break; case R.id.btn2: GridLayoutManager gridLayoutManager=new GridLayoutManager(this,2); gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyc.setLayoutManager(gridLayoutManager); break; case R.id.btn3: /* * 瀑布流看不出效果 * * item不居中需要填wrap_content(也就是自适应) * * */ StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); recyc.setLayoutManager(staggeredGridLayoutManager); break; } } }
adapter
package com.example.iamchan.recyc; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import java.util.List; /** * Created by iamchan on 2018/9/28. */ public class RecycAdapter extends RecyclerView.Adapter<RecycAdapter.MyViewHolder>{ /* * * 另一种实现监听事件的实现方式采用接口回调的方式 * * */ public interface OnItemClickListener{ public void onItemClickListener(int position); public void onItemLongClickListener(int position); public void onTextClickListener(int position); public void onTextLongClickListener(int position); } OnItemClickListener onItemClickListener; public void setOnViewClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener=onItemClickListener; } /* * * 属性一般俩一个是数据源 * 另一个是上下问对象 * * */ private Context context; private List<String> strings; /* * * 构造方法初始化数据 * * */ public RecycAdapter(Context context, List<String> strings) { this.context = context; this.strings = strings; } /* * * * 创建viewHolder * 这个主要作用就是找到item布局 * 把布局里面有用的控件与Viewholder进行关联 * * * */ @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=LayoutInflater.from(context).inflate(R.layout.item,parent,false); return new MyViewHolder(view); } /* * * * 绑定viewholder * 主要是数据源与viewHolder的绑定 * 这里可以实现监听事件 * * */ @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.textView.setText(strings.get(position)); /* * * 监听事件 *这是一种方式实现监听事件 * */ /* holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context, "view"+position, Toast.LENGTH_SHORT).show(); } }); holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context, "text"+position, Toast.LENGTH_SHORT).show(); } });*/ /* * * 接口回调方式实现监听事件 * * */ holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(onItemClickListener!=null) { onItemClickListener.onItemClickListener(position); } } }); holder.view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if(onItemClickListener!=null) { onItemClickListener.onItemLongClickListener(position); } return false; } }); holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(onItemClickListener!=null) onItemClickListener.onTextClickListener(position); } }); holder.textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if(onItemClickListener!=null) onItemClickListener.onTextLongClickListener(position); return false; } }); } /* * * 获取数据源条数 * * */ @Override public int getItemCount() { return strings.size(); } /* * * viewholder与布局中的控件关联 * view代表一个item * * */ public class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; View view; public MyViewHolder(View itemView) { super(itemView); view=itemView; textView=itemView.findViewById(R.id.text); } } }
item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:background="#000" android:textColor="#fff" android:layout_gravity="center" android:id="@+id/text" android:gravity="center" android:text="文字" android:textSize="18dp" android:layout_width="40dp" android:layout_height="80dp" /> <View android:background="#e0e0e0" android:layout_width="match_parent" android:layout_height="2dp"></View> </LinearLayout>