工作内容:
RecylerView实现,及其点击事件
学习分享:
主要方法:
recyclerView.setLayoutManager(....) ;//设置布局方式,
布局方式:
LinearLayoutManager 线性(水平,垂直)
GridLayoutManager网格(默认是垂直方向)
StaggeredGridLayoutManager(行/列数,水平/垂直方向)瀑布流显示方式【注意xml中的设置,见下方代码】
recyclerView.setAdapter(adapter);// 设置适配器
recyclerView.addItemDecoration(); //设置分隔线
recyclerView.setHasFixedSize(true); //设置每项内容不会改变recyclerView的大小,可以提高性能
recyclerView.setItemAnimator(RecyclerView.ItemAnimator itemAnimator);//设置列表项动画(添加,删除)
Activity代码:
Adapter代码: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.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import test.android.com.testapplication.adapter.RecyAdapter; import test.android.com.testapplication.base.OnRecylerItemClick; public class RecylerActivity extends AppCompatActivity { private RecyclerView recyclerView; private RecyAdapter adapter; private List<Integer> list; private int [] imgIDs = {R.drawable.a111,R.drawable.a112,R.drawable.a113,R.drawable.a114,R.drawable.a115 ,R.drawable.a116,R.drawable.a117,R.drawable.a118,R.drawable.a119,R.drawable.a120,R.drawable.a121 ,R.drawable.a122,R.drawable.a123,R.drawable.a124,R.drawable.a125,R.drawable.a126,R.drawable.a127 ,R.drawable.a128,R.drawable.a129,R.drawable.a130,R.drawable.a111,R.drawable.a112,R.drawable.a113 ,R.drawable.a114,R.drawable.a115,R.drawable.a116,R.drawable.a117,R.drawable.a118,R.drawable.a119 ,R.drawable.a120,R.drawable.a121,R.drawable.a122,R.drawable.a123,R.drawable.a124,R.drawable.a125 ,R.drawable.a126,R.drawable.a127,R.drawable.a128,R.drawable.a129,R.drawable.a130}; private Toolbar toolbar; private LinearLayoutManager linear; private GridLayoutManager girdLayoutManager; private StaggeredGridLayoutManager staggeredGridLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recyler); initData(); initView(); } private void initData() { list = new ArrayList<>(); for (int i = 0; i < imgIDs.length; i++) { list.add(imgIDs[i]); } } private void initView() { toolbar = (Toolbar)findViewById(R.id.toolbar_recy) ; setSupportActionBar(toolbar); recyclerView = (RecyclerView)findViewById(R.id.rv_recy); recyclerView.setHasFixedSize(true); //设置每项不会改变recylerView的大小,可以提高性能 /** * 表示显示方式(VERTICAL 竖 HORIZONTAL 横)单列/横 */ linear = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); /** * 参数1:context 参数2:表示列数 */ girdLayoutManager=new GridLayoutManager(this,2); /** * 参数1:显示列数/行数 参数2:表示显示方式(VERTICAL 1 竖 HORIZONTAL 0 横) * 【实现瀑布流】 */ staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(staggeredGridLayoutManager); /** * 添加item的分隔线 */ adapter = new RecyAdapter(list); recyclerView.setAdapter(adapter); // recyclerView.addItemDecoration(); //设置分隔线,可以在item布局文件中写模拟的分隔线 /** * 将回调函数的实现类传递进adapter的setOnRecylerItemClick方法中 * 【实现长按recyView项的时候弹出一条提示】 */ adapter.setOnRecylerItemClick(new OnRecylerItemClick() { @Override public void onItemClick(int position) { Toast.makeText(RecylerActivity.this,list.get(position),Toast.LENGTH_SHORT).show(); } }); } //设置toolbar的右边图标 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_recy,menu); return super.onCreateOptionsMenu(menu); } /** * 点击toolbar上的右边按钮 * 实现:显示的方式变换【横向,纵向】 * 添加,删除recylerView中的项 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.menu_item1: //设置显示方式为linear recyclerView.setLayoutManager(linear); break; case R.id.menu_item2: recyclerView.setLayoutManager(girdLayoutManager); break; case R.id.menu_item3: recyclerView.setLayoutManager(staggeredGridLayoutManager); break; case R.id.add_menu_item: //添加项 list.add(3,R.drawable.a115); adapter.notifyItemInserted(3);//插入位置是3【注意list和adapter中的添加位置保持一致】 // adapter.notifyDataSetChanged();//也是生效的,动画效果没那么明显 break; case R.id.cut_menu_item: //删除项 list.remove(4); adapter.notifyItemRemoved(4); break; } return super.onOptionsItemSelected(item); } }
import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.List; import test.android.com.testapplication.base.OnRecylerItemClick; import test.android.com.testapplication.R; /** * Created by Administrator on 2016/9/7. */ public class RecyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener{ private OnRecylerItemClick onRecylerItemClick; private List<Integer> list; public RecyAdapter(List<Integer> list) { this.list = list; } //解析布局文件并传回MyViewHolder @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyler,parent,false); MyViewHolder vh = new MyViewHolder(view); //将解析的布局文件的view传进MyViewHolder return vh; } public void setOnRecylerItemClick(OnRecylerItemClick onRecylerItemClick) { this.onRecylerItemClick = onRecylerItemClick; } /** * 设置组件的显示内容(配置MyViewHolder的属性的值) * 记得向下转型成自定义的MyViewHolder * @param holder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final int position1 = position; MyViewHolder myViewHolder = (MyViewHolder)holder; myViewHolder.imageView.setBackgroundResource(list.get(position)); //添加列表项的长按事件 myViewHolder.imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //回调接口中的方法 onRecylerItemClick.onItemClick(position1); return true; } }); } @Override public int getItemCount() { return list.size(); } @Override public void onClick(View v) { } //自定义的持有者 class MyViewHolder extends RecyclerView.ViewHolder{ private ImageView imageView; public ImageView getTextView() { return imageView; } public void setTextView(ImageView imageView) { this.imageView = imageView; } //实现构造方法【必须】 public MyViewHolder(View itemView) { super(itemView); //记得要findViewById找到组件 imageView = (ImageView)itemView.findViewById(R.id.iv_item_recy); } } }回调接口代码:
public interface OnRecylerItemClick { void onItemClick(int position); }RecylerView项布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 下面的LinearLayout用于设置 列表项之间的间距 --> <LinearLayout android:layout_marginBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="#F7F7F7" android:layout_centerInParent="true"> <!-- width="match_parent" && height="wrap_content" 1.当RecylerView用瀑布流布局管理管理时,竖向(纵向)显示时宽度平分给item, 这里的宽度就会适应这个平分到的宽度,之后让高度自适应【图片设置成背景图片】, 显示出的图片就会是:宽度 = 平分得到的宽度 高度 = 按比例缩放的高度(按宽度比例缩放) 2.当RecylerView用瀑布流布局管理管理时,横向,显示的高度平分给item...宽高设置与现在的设置相反就可以了 【注意:外层布局应该用 width="wrap_content" height="wrap_content"】 --> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/a112" android:id="@+id/iv_item_recy" /> </LinearLayout> </RelativeLayout>activity布局文件:
<?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:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" tools:context=".RecylerActivity"> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/toolbar_recy" android:titleTextColor="#ffffff" android:background="@color/deepskyblue" android:title="切换显示风格" app:popupTheme="@style/OverflowMenuStyle" > </android.support.v7.widget.Toolbar> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv_recy" > </android.support.v7.widget.RecyclerView> </LinearLayout>
实现效果: