初次学习RecyclerView,看别人的项目才发现有这么一个控件,于是为了增加储备知识,其实是为了找工作增加点底气。
遇到的问题:1、在包名前出现这个错误Multiple markers at this line,经过查证需要升级v4包的版本
2、 因为是用的eclipse,所以需要添加两个v7包:android-support-v7-appcompat(ActionBarActivity和ToolBar)、 android-support-v7-recyclerview,后来出现了这样的错误java.lang.NoClassDefFoundError: * : Landroid/support/v7/gridlayout/R$styleable,后来查资料才知道,需要将android-support-v7-appcompat包的源码作为依赖库连接进来才行,然后搞了半天还是不知道怎么设置成依赖库,所以果断放弃使用ActionBarActivity和Toolbar,继续使用Activity,
3、v4和v7包版本最好一直,否则容易出现错误,这里是下载大神的v4和v7的集合包
编译工具:eclipse-android-neon-2-incubation-win32
模拟器:Genymotion
jar包:android-support-v7-recyclerview 和v7相同版本的v4包
关于RecyclerView的一下介绍:可以实现和ListView、GridView相同的效果,整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
你想要控制其显示的方式,请通过布局管理器LayoutManager你想要控制Item间的间隔(可绘制),请通过ItemDecoration你想要控制Item增删的动画,请通过ItemAnimator你想要控制点击、长按事件,请自己写(擦,这点尼玛。) ,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置 首先是MainActivity package com.example.recyclerview; import java.util.ArrayList; import java.util.List; import com.example.recyclerview.SimpleAdapter.OnItemClickListener; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; //import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { private RecyclerView mRecyclerView; private List<String> mDatas; private SimpleAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据 initDatas(); // 初始化view initViews(); // 给recyclerview添加适配器 mAdapter = new SimpleAdapter(this, mDatas); mRecyclerView.setAdapter(mAdapter); // 设置RecyclerView的布局管理 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(linearLayoutManager); // 设置默认分隔线 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); // 设置RecyclerView的Item间分隔线 // mRecyclerView.addItemDecoration(new DividerItemDecoration(this, // DividerItemDecoration.VERTICAL_LIST)); // 添加监听事件(此处的监听事件需要自己在simple中自己写) mAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemLongClick(View view, int position) { Toast.makeText(MainActivity.this, "Long click" + position, Toast.LENGTH_SHORT).show(); } @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "click" + position, Toast.LENGTH_SHORT).show(); } }); } private void initViews() { mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerView); } private void initDatas() { mDatas = new ArrayList<String>(); for (int i = 'A'; i <= 'z'; i++) { mDatas.add("" + (char) i); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_add: mAdapter.addData(1);// 添加 break; case R.id.action_delete: mAdapter.deleteDate(1);// 删除 break; case R.id.action_gridview: mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));// 网格布局 break; case R.id.action_listview: mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); break; case R.id.action_staggered: // 瀑布流布局 Intent intent = new Intent(this, StaggeredGridLayoutActivity.class); startActivity(intent); break; case R.id.action_hor_gridview: // 横向五列布局 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL)); break; default: break; } return super.onOptionsItemSelected(item); } } 然后是相对应的simpleAdapter package com.example.recyclerview; import java.util.List; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.TextView; public class SimpleAdapter extends RecyclerView.Adapter<MyViewHolder> { private LayoutInflater mInflater; protected List<String> mDatas; /** 系统中并没有提供click和longclick方法,所以需要我们自己写回调 */ public interface OnItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } /******************************************************/ public SimpleAdapter(Context context, List<String> datas) { this.mDatas = datas; mInflater = LayoutInflater.from(context); } @Override public int getItemCount() { return mDatas.size(); } @Override public void onBindViewHolder(final MyViewHolder holder, final int pos) { holder.tv.setText(mDatas.get(pos)); setUpItemEvent(holder); } protected void setUpItemEvent(final MyViewHolder holder) { if (mOnItemClickListener != null) { holder.itemView.setOnClickListener(new OnClickListener() { public void onClick(View v) { int position = holder.getPosition(); mOnItemClickListener.onItemClick(holder.itemView, position); } }); holder.itemView.setOnLongClickListener(new OnLongClickListener() { public boolean onLongClick(View v) { int position = holder.getPosition(); mOnItemClickListener.onItemLongClick(holder.itemView, position); return false; } }); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) { View view = mInflater.inflate(R.layout.item_single_textview, arg0, false); MyViewHolder viewholder = new MyViewHolder(view); return viewholder; } //添加 public void addData(int pos) { mDatas.add(pos, "Insert One"); notifyItemInserted(pos); } //删除 public void deleteDate(int pos) { mDatas.remove(pos); notifyItemRemoved(pos); } } class MyViewHolder extends ViewHolder { TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.id_tv); } } 下面是瀑布流的实现代码 StaggeredGridLayoutActivity package com.example.recyclerview; import java.util.ArrayList; import java.util.List; import com.example.recyclerview.SimpleAdapter.OnItemClickListener; import android.app.Activity; import android.os.Bundle; //import android.support.v7.widget.GridLayoutManager; //import android.support.v7.app.ActionBarActivity; //import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class StaggeredGridLayoutActivity extends Activity { private RecyclerView mRecyclerView; private List<String> mDatas; private StaggeredAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initDatas(); initViews(); // 设置RecyclerView的布局管理 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); mAdapter = new StaggeredAdapter(this, mDatas); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemLongClick(View view, int position) { mAdapter.deleteDate(position); } @Override public void onItemClick(View view, int position) { } }); } private void initViews() { mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerView); } private void initDatas() { mDatas = new ArrayList<String>(); for (int i = 'A'; i <= 'z'; i++) { mDatas.add("" + (char) i); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { } return super.onOptionsItemSelected(item); } } 相对于的适配器,因为内容和simpleAdapter大致相同,所以直接继承 StaggeredAdapter package com.example.recyclerview; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; public class StaggeredAdapter extends SimpleAdapter { private List<Integer> mHeights; public StaggeredAdapter(Context context, List<String> datas) { super(context, datas); mHeights = new ArrayList<Integer>(); for(int i = 0; i < mDatas.size();i++){ mHeights.add((int) (100+Math.random()*300)); } } @Override public void onBindViewHolder(MyViewHolder holder, int pos) { LayoutParams lp = holder.tv.getLayoutParams(); lp.height = mHeights.get(pos); holder.tv.setLayoutParams(lp); holder.tv.setText(mDatas.get(pos)); setUpItemEvent(holder); } } 布局文件item_single_text.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="3dp" android:background="@drawable/item_bg" > <TextView android:id="@+id/id_tv" android:layout_width="100dp" android:layout_height="100dp" android:gravity="center" /> </FrameLayout>这里还有menu菜单的布局设置 main.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_listview" android:orderInCategory="100" android:title="ListView" android:showAsAction="never" /> <item android:id="@+id/action_gridview" android:orderInCategory="100" android:title="GridView" android:showAsAction="never" /> <item android:id="@+id/action_hor_gridview" android:orderInCategory="100" android:title="HorizontalGridView" android:showAsAction="never" /> <item android:id="@+id/action_staggered" android:orderInCategory="100" android:title="StaggeredGridView" android:showAsAction="never" /> <item android:id="@+id/action_add" android:orderInCategory="100" android:title="Add" android:showAsAction="ifRoom" /> <item android:id="@+id/action_delete" android:orderInCategory="100" android:title="Delete" android:showAsAction="ifRoom" /> </menu>模块的颜色变化,点击为深红色,不点击为淡红色,用到了状态选择器 item_bg.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@color/state_item_pressed"></item> <item android:drawable="@color/state_item_normal"></item> </selector> 以上只是一般的功能,具体的实现效果就不一一贴出来了