Android-RecycleView
来源:互联网 发布:淘宝最低价插件 编辑:程序博客网 时间:2024/05/19 17:24
本文主要是对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; }}
0 0
- android recycleView
- Android RecycleView
- Android-RecycleView
- Android RecycleView---- RecycleView的简单使用
- Android 5.0 Design RecycleView
- Android RecycleView(一)
- Android RecycleView的使用
- Android RecycleView汇总
- android recycleview使用
- android RecycleView的使用
- android recycleView使用总结
- Android recycleview+cardview
- Android中的RecycleView
- Android RecycleView使用详解
- Android RecycleView分割线
- Android RecycleView 应用
- android RecycleView的使用
- Android recycleview 多布局
- 清空数据表(实则更改状态)
- BZOJ2815 ZJOI2012 灾难 构造+LCA+树形dp+拓扑排序
- 361_TYPE_CLASS_TEXT属性
- Android抖动动画的实现与思考
- vmware 备份Linux虚拟机,部署到esxi服务器中
- Android-RecycleView
- 362_显示键盘和收起键盘
- 音视频学习
- Windows数据类型的罗列
- 学习Hadoop第二十一课(Hadoop集群测试)
- Problem 4 Largest palindrome product (暴力枚举)
- ES6-对象
- H5_Node3_本地存储&新的JS-API
- 【POJ 2019】2D-RMQ裸题