本文主要是对RecycleView在使用时进行了一个封装,通过学习别人源码时觉得这种处理办法还不错,便增加上一个使用的方法,和添加XML解析,最后展现的一个例子。
1、处理RecyclerView.ViewHolder
package adapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by APICAL on 2016/10/18.
*/
public abstract class RecyclerViewHolderBasic extends RecyclerView.ViewHolder{
public RecyclerViewHolderBasic(View itemView) {
super(itemView);
}
protected abstract View getViewHolder();
}
2、处理RecyclerView.Adapter
package adapter;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* Created by APICAL on 2016/10/18.
*/
public abstract class RecycleViewAdapterBasic<T> extends RecyclerView.Adapter<RecyclerViewHolderBasic>{
private List<T> resourceDataSetList;
private View mHeaderView;
private static final int TYPE_HEADER = 0x00000001;
private static final int TYPE_NORMAL = 0x00000000;
private OnViewHolderItemClickListener itemClickListener;
public RecycleViewAdapterBasic(){
this(null);
}
public RecycleViewAdapterBasic(Context context){
resourceDataSetList = new ArrayList<>();
}
protected List<T> getResourceDataSetList(){
return resourceDataSetList;
}
protected T getItemData(int position){
return resourceDataSetList.get(position);
}
public abstract void setResourceDataSetListAll(List<T> dataSetList);
//{
// resourceDataSetList.addAll(dataSetList);
//}
public abstract void removeItemFromResourceDataSetList(int position);
/*{
resourceDataSetList.remove(position);
notifyDataSetChanged();
}*/
public abstract void removeItemFromResourceDataSetList(T item);
/*{
resourceDataSetList.remove(item);
notifyDataSetChanged();
}*/
public void setHeaderViewToHolder(View headerView){
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderViewFromHolder(){
return mHeaderView;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public int getItemViewType(int position) {
//return super.getItemViewType(position);
if (mHeaderView == null ) return TYPE_NORMAL;
if (position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}
@Override
public void onViewDetachedFromWindow(RecyclerViewHolderBasic holder) {
super.onViewDetachedFromWindow(holder);
}
@Override
public void onViewAttachedToWindow(RecyclerViewHolderBasic holder) {
// onViewDetachedFromWindow 可见列表滑出window,但是滑出的不长
// onViewAttachedToWindow 当列表项出现到可视界面的时候调用
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if(lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams
&& holder.getLayoutPosition() == 0) {
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(true);
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return getItemViewType(position) == TYPE_HEADER
? gridManager.getSpanCount() : 1;
}
});
}
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
}
public static class HeaderViewHolder extends RecyclerViewHolderBasic {
public HeaderViewHolder(View itemView) {
super(itemView);
}
@Override
protected View getViewHolder() {
return null;
}
}
@Override
public RecyclerViewHolderBasic onCreateViewHolder(ViewGroup parent, int viewType) {
if(mHeaderView != null && viewType == TYPE_HEADER) {
return new HeaderViewHolder(mHeaderView);
}
return onCreateItemViewHolder(parent, viewType);
}
protected abstract RecyclerViewHolderBasic onCreateItemViewHolder(ViewGroup parent, int viewType);
/**
* 获得item的位置
* @param holder
* @return
*/
public int getRealPosition(RecyclerViewHolderBasic holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
@Override
public void onBindViewHolder(RecyclerViewHolderBasic holder, int position) {
/**如果是header view就直接返回,不需要绑定数据**/
if(getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(holder);
final T data = resourceDataSetList.get(pos);
bindDataToViewHolder(holder, position);
if(itemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemClickListener.OnViewHolderClick(pos, data);
}
});
}
}
protected abstract void bindDataToViewHolder(RecyclerViewHolderBasic holder, int position);
@Override
public int getItemCount() {
return mHeaderView == null ? resourceDataSetList.size() : resourceDataSetList.size() + 1;
}
public void setOnViewHolderItemClickListener(OnViewHolderItemClickListener listener) {
itemClickListener = listener;
}
public interface OnViewHolderItemClickListener<T> {
/**
* item 点击事件接口
* @param
*/
void OnViewHolderClick(int position, T data);
}
}
3、使用的具体适配器的实现:
package com.example.tangyd.tang_yd_recycleview;
import android.content.Context;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import Modle.Persons;
import adapter.RecycleViewAdapterBasic;
import adapter.RecyclerViewHolderBasic;
/**
* Created by APICAL on 2016/10/18.
*/
public class RecycleViewAdapter extends RecycleViewAdapterBasic<Persons.Person> {
private Context mContext;
private LayoutInflater mLayoutInflater;
public RecycleViewAdapter(Context context) {
super(context);
this.mContext = context;
this.mLayoutInflater = LayoutInflater.from(mContext);
}
@Override
public void setResourceDataSetListAll(List<Persons.Person> dataSetList) {
if (dataSetList != null) {
getResourceDataSetList().addAll(dataSetList);
}
Log.v(this.getClass().getCanonicalName(), "Tang_YD | itemCount = " + getItemCount());
}
@Override
public void removeItemFromResourceDataSetList(int position) {
getResourceDataSetList().remove(position);
notifyDataSetChanged();
}
@Override
public void removeItemFromResourceDataSetList(Persons.Person item) {
getResourceDataSetList().remove(item);
notifyDataSetChanged();
}
@Override
protected RecyclerViewHolderBasic onCreateItemViewHolder(ViewGroup parent, int viewType) {
View containerView = mLayoutInflater.inflate(R.layout.view_holder_item, null, false);
AdapterViewHolder viewHolder = new AdapterViewHolder(containerView);
return viewHolder;
}
@Override
protected void bindDataToViewHolder(RecyclerViewHolderBasic holder, int position) {
AdapterViewHolder viewHolder = (AdapterViewHolder) holder;
String _name = getItemData(position).getName();
viewHolder.person_text_view.setText(_name);
}
public static final class SpaceItemDecoration extends RecyclerView.ItemDecoration{
int _param;
public SpaceItemDecoration(int param) {
super();
this._param = param;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (parent.getChildAdapterPosition(view) != 0){
outRect.left = _param;
outRect.right = _param;
outRect.top = _param;
outRect.bottom = _param;
}
}
}
class AdapterViewHolder extends RecyclerViewHolderBasic{
private View _layoutView;
public TextView person_text_view;
public AdapterViewHolder(View itemView) {
super(itemView);
_layoutView = itemView;
person_text_view = (TextView) _layoutView.findViewById(R.id.person_text_view_ID);
}
@Override
protected View getViewHolder() {
return _layoutView;
}
}
}
4、于MainActivity调用:
package com.example.tangyd.tang_yd_recycleview;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import decode.ParsonParser;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private RecyclerView recycler_view;
private LinearLayoutManager mLinearLayoutManager;
private RecycleViewAdapter adapter;
private void setRecyclerView(){
mLinearLayoutManager = new LinearLayoutManager(this);
mLinearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
recycler_view.setLayoutManager(mLinearLayoutManager);
recycler_view.setItemAnimator(new DefaultItemAnimator());
adapter = new RecycleViewAdapter(this);
ParsonParser _parsonParser = new ParsonParser(this, "workers.xml");
adapter.setResourceDataSetListAll(_parsonParser.xmlParse());
//设置item间距
int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.d_10dp);
recycler_view.addItemDecoration(new RecycleViewAdapter.SpaceItemDecoration(spacingInPixels));
recycler_view.setAdapter(adapter);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycler_view = (RecyclerView) findViewById(R.id.recycler_view_ID);
setRecyclerView();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
5、本例中使用到Person类:
package Modle;
import android.os.*;
import android.os.Parcel;
import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.LinkedList;
import java.util.List;
/**
* Created by APICAL on 2016/10/18.
*/
public class Persons {
private static final String LOG_TAG = Persons.class.getSimpleName();
private static final String TAGName = "workers";
private static final String START_TAG = "worker";
private static final String VAR0_TAG = "id";
private static final String VAR1_TAG = "name";
private static final String VAR2_TAG = "age";
private static final String VAR3_TAG = "money";
private static final String VAR4_TAG = "sex";
private static final String VAR5_TAG = "status";
//<?xml version="1.0" encoding="UTF-8"?>
/**
<workers>
<worker id="001">
<name>zhangsan</name>
<age>23</age>
<money>4000</money>
<sex>male</sex>
<status>staff</status>
</worker>
<worker id="002">
<name>lisi</name>
<age>33</age>
<money>8000</money>
<sex>male</sex>
<status>marketingManager</status>
</worker>
<worker id="003">
<name>wangxiao</name>
<age>29</age>
<money>6000</money>
<sex>female</sex>
<status>administrativeAssistant</status>
</worker>
</workers>
*/
public class PersonsParse extends DefaultHandler {
private List<Person> mPersonList;
private Person mPerson;
private String lineTagName;
private StringBuffer mStringBuffer = new StringBuffer();
private OnParseEndListener listener;
public List<Person> getPersonList(){
return mPersonList;
}
public void setOnParseEndListener(OnParseEndListener listener){
this.listener = listener;
}
public PersonsParse() {
super();
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
mPersonList = new LinkedList<>();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
if (listener == null){
return;
}
listener.onParseEnd(mPersonList);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if (lineTagName.equals(VAR1_TAG)){
String _name = new String(ch, start, length).toString().trim();
if (!_name.equals("")) {
mPerson.setName(_name);
}
}
if (lineTagName.equals(VAR2_TAG)){
String _age = new String(ch, start, length).toString().trim();
if (!_age.equals("")) {
mPerson.setAge(Integer.parseInt(_age));
}
}
if (lineTagName.equals(VAR3_TAG)){
String _money = new String(ch, start, length).toString().trim();
if (!_money.equals("")) {
mPerson.setMoney(Integer.parseInt(_money));
}
}
if (lineTagName.equals(VAR4_TAG)){
String _sex = new String(ch, start, length).toString().trim();
if (!_sex.equals("")) {
mPerson.setSex(_sex);
}
}
if (lineTagName.equals(VAR5_TAG)){
String work = new String(ch, start, length).toString().trim();
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
lineTagName = localName;
Log.v(LOG_TAG + "." + this.getClass().getCanonicalName(), lineTagName + " / " + uri + " / " + qName + " / " +attributes);
if (lineTagName.equals(START_TAG)){
mPerson = new Person();
int length = attributes.getLength();
for (int i = 0; i < length; i++){
if (attributes.getLocalName(i).equals(VAR0_TAG)){
mPerson.setId(Integer.parseInt(attributes.getValue(i)));
}
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals(START_TAG)){
mPersonList.add(mPerson);
}
}
}
public interface OnParseEndListener{
void onParseEnd( List<Person> list);
}
public static class Person implements Parcelable {
private int id;
private String name;
private String sex;
private int age;
private int money;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Person(){
super();
}
public Person(int id, String name, String sex, int age, int money) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.money = money;
}
protected Person(Parcel in) {
id = in.readInt();
name = in.readString();
age = in.readInt();
sex = in.readString();
money = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeString(sex);
dest.writeInt(age);
dest.writeInt(money);
}
}
}
6、对应的解析类基类:
package decode;
import android.content.Context;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
/**
* Created by APICAL on 2016/10/19.
*/
public abstract class XmlParser<T> implements DecodeManager<T>{
public String readerXmlByReader(Context context, String xmlName){
String _variableContent = "";
InputStream inputStream = null;
try {
inputStream = context.getAssets().open(xmlName);
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader bufferedReader = null;
FileInputStream fileInputStream = (FileInputStream) inputStream;
//bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
try {
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String line;
StringBuilder mStringBuilder = new StringBuilder();
try {
while ((line = bufferedReader.readLine()) != null){
mStringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
_variableContent = mStringBuilder.toString();
return _variableContent;
}
public String xmlReaderByStream(Context context, String xmlName){
InputStream inputStream;
String _xmlContent = "";
BufferedInputStream bufferedInputStream = null;
try {
inputStream = context.getAssets().open(xmlName);//("workers.xml");
bufferedInputStream = new BufferedInputStream(inputStream);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int line;
byte[] mByte = new byte[1024 * 1024];
while((line = bufferedInputStream.read(mByte)) != -1) {
byteArrayOutputStream.write(mByte, 0, line);
}
_xmlContent = byteArrayOutputStream.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return _xmlContent;
}
public String xmlParser(InputStream inputStream){
String _variableContent = "";
BufferedInputStream mBufferedInputStream = new BufferedInputStream(inputStream);
byte[] mByte = new byte[1024 * 1024];
int line;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
while ((line = mBufferedInputStream.read(mByte)) != -1){
outputStream.write(mByte, 0, line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
mBufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
_variableContent = outputStream.toString();
return _variableContent;
}
}
7、DecodeManager接口:
package decode;
/**
* Created by APICAL on 2016/10/19.
*/
public interface DecodeManager<T> {
T xmlParse();
}
8、具体的解析类:
package decode;
import android.content.Context;
import android.util.Log;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import Modle.Persons;
/**
* Created by APICAL on 2016/10/19.
*/
public class ParsonParser extends XmlParser<List>{
private String xmlName;
private Context context;
public ParsonParser(Context context, String xmlName){
this.context = context;
this.xmlName = xmlName;
}
@Override
public List xmlParse() {
final List<Persons.Person> personList = new ArrayList<>();
Persons _persons = new Persons();
Persons.PersonsParse _personsParse = _persons.new PersonsParse();
_personsParse.setOnParseEndListener(new Persons.OnParseEndListener() {
@Override
public void onParseEnd(java.util.List<Persons.Person> list) {
personList.addAll(list);
}
});
String _VariableContent = xmlReaderByStream(context, xmlName);
SAXParserFactory _factory = SAXParserFactory.newInstance();
try {
XMLReader _xmlReader = _factory.newSAXParser().getXMLReader();
_xmlReader.setContentHandler(_personsParse);// 设置解析内容
try {
_xmlReader.parse(new InputSource(new StringReader(_VariableContent)));// 开始解析
} catch (IOException e) {
e.printStackTrace();
}
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Log.v(this.getClass().getSimpleName(), "Tang_YD" + "\n" + personList.size());
if (personList.isEmpty()){
return null;
}
return personList;
}
}