初学RecyclerView

初次学习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>
以上只是一般的功能,具体的实现效果就不一一贴出来了















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值