初次学习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
- 你想要控制点击、长按事件,请自己写(擦,这点尼玛。)
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>
以上只是一般的功能,具体的实现效果就不一一贴出来了