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
原创粉丝点击