Coder Social home page Coder Social logo

baseadapter's Introduction

base-adapter

Android 万能的Adapter for ListView,RecyclerView,GridView等,支持多种Item类型的情况。

引入

ForRecyclerView

compile 'com.zhy:base-rvadapter:3.0.3'

ForListView

compile 'com.zhy:base-adapter:3.0.3'

使用

##(1)简单的数据绑定(ListView与其使用方式一致)

首先看我们最常用的单种Item的书写方式:

mRecyclerView.setAdapter(new CommonAdapter<String>(this, R.layout.item_list, mDatas)
{
    @Override
    public void convert(ViewHolder holder, String s)
    {
        holder.setText(R.id.id_item_list_title, s);
    }
});

是不是相当方便,在convert方法中完成数据、事件绑定即可。

只需要简单的将Adapter继承CommonAdapter,复写convert方法即可。省去了自己编写ViewHolder等大量的重复的代码。

  • 可以通过holder.getView(id)拿到任何控件。
  • ViewHolder中封装了大量的常用的方法,比如holder.setText(id,text),holder.setOnClickListener(id,listener)等,可以支持使用。

效果图:

##(2)多种ItemViewType(ListView与其使用方式一致)

对于多中itemviewtype的处理参考:https://github.com/sockeqwe/AdapterDelegates ,具有极高的扩展性。

MultiItemTypeAdapter adapter = new MultiItemTypeAdapter(this,mDatas);
adapter.addItemViewDelegate(new MsgSendItemDelagate());
adapter.addItemViewDelegate(new MsgComingItemDelagate());

每种Item类型对应一个ItemViewDelegete,例如:

public class MsgComingItemDelagate implements ItemViewDelegate<ChatMessage>
{

    @Override
    public int getItemViewLayoutId()
    {
        return R.layout.main_chat_from_msg;
    }

    @Override
    public boolean isForViewType(ChatMessage item, int position)
    {
        return item.isComMeg();
    }

    @Override
    public void convert(ViewHolder holder, ChatMessage chatMessage, int position)
    {
        holder.setText(R.id.chat_from_content, chatMessage.getContent());
        holder.setText(R.id.chat_from_name, chatMessage.getName());
        holder.setImageResource(R.id.chat_from_icon, chatMessage.getIcon());
    }
}

贴个效果图:

##(3) 添加HeaderView、FooterView

mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter);

TextView t1 = new TextView(this);
t1.setText("Header 1");
TextView t2 = new TextView(this);
t2.setText("Header 2");
mHeaderAndFooterWrapper.addHeaderView(t1);
mHeaderAndFooterWrapper.addHeaderView(t2);

mRecyclerView.setAdapter(mHeaderAndFooterWrapper);
mHeaderAndFooterWrapper.notifyDataSetChanged();

类似装饰者模式,直接将原本的adapter传入,初始化一个HeaderAndFooterWrapper对象,然后调用相关API添加。

##(4) 添加LoadMore

mLoadMoreWrapper = new LoadMoreWrapper(mOriginAdapter);
mLoadMoreWrapper.setLoadMoreView(R.layout.default_loading);
mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener()
{
    @Override
    public void onLoadMoreRequested()
    {
    }
});

mRecyclerView.setAdapter(mLoadMoreWrapper);

直接将原本的adapter传入,初始化一个LoadMoreWrapper对象,然后调用相关API即可。

##(5)添加EmptyView

mEmptyWrapper = new EmptyWrapper(mAdapter);
mEmptyWrapper.setEmptyView(R.layout.empty_view);

mRecyclerView.setAdapter(mEmptyWrapper );

直接将原本的adapter传入,初始化一个EmptyWrapper对象,然后调用相关API即可。

支持链式添加多种功能,示例代码:

mAdapter = new EmptyViewWrapper(
	new LoadMoreWrapper(
	new HeaderAndFooterWrapper(mOriginAdapter)));

一些回调

onViewHolderCreated

mListView.setAdapter(new CommonAdapter<String>(this, R.layout.item_list, mDatas)
{
    @Override
    public void convert(ViewHolder holder, String o, int pos)
    {
        holder.setText(R.id.id_item_list_title, o);
    }

    @Override
    public void onViewHolderCreated(ViewHolder holder, View itemView)
    {
        super.onViewHolderCreated(holder, itemView);
       //AutoUtil.autoSize(itemView)
    }
});

感谢

baseadapter's People

Contributors

hongyangandroid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

baseadapter's Issues

数据更新

为什么调用了adapter.notifyDataSetChanged() 数据没有更新,用的CommAdapter

发现这个是bug,mData在CommonAdapter还定义?

protected List mDatas;在CommonAdapter还有定义,而convert使用的数据是MultiItemTypeAdapter中的mDatas,这样容易出现改变数据时,刷新后RecyclerView没有改变,其实改变只是CommonAdapter中定义的mDatas。这个mDatas具体的作用是?

数组越位

但我使用多item布局,且使用HeaderAndFooterWrapper加入了头部,我的Adapter extends MultiItemTypeAdapter
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if (manager instanceof GridLayoutManager) { final GridLayoutManager gridLayoutManager = (GridLayoutManager) manager; gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { LogUtils.e("position:" + position); int viewType = getItemViewType(position);会出现数组越位的情况

加载更多的时候点击最后一个item会出现越界

如题

等加载完成之后点击就又没有问题了

07-13 11:12:22.116 6026-6026/com.movieapp E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IndexOutOfBoundsException: Invalid index 118, size is 118 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.zhy.adapter.recyclerview.MultiItemTypeAdapter$1.onClick(MultiItemTypeAdapter.java:72) at android.view.View.performClick(View.java:4240) at android.view.View$PerformClick.run(View.java:17752) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5473) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691) at dalvik.system.NativeStart.main(Native Method)

SectionAdapter 调用时写错还是?

这个文件的构造函数调用父类的,

    public SectionAdapter(Context context, int layoutId, MultiItemTypeSupport multiItemTypeSupport, List<T> datas, SectionSupport sectionSupport)
    {
        super(context, datas, null);
       ......
    }

在父类中判断这个为空直接异常。

    public MultiItemCommonAdapter(Context context, List<T> datas,
                                  MultiItemTypeSupport<T> multiItemTypeSupport)
    {
        super(context, -1, datas);
        mMultiItemTypeSupport = multiItemTypeSupport;

        if (mMultiItemTypeSupport == null)
            throw new IllegalArgumentException("the mMultiItemTypeSupport can not be null.");
    }

不知是写错还是什么原因?

多布局问题

谁的多布局会用多个实体类呢 ?这设计得不咋样。

关于setOnItemClickListener

adapter.setOnItemClickListener
为什么要实现onItemLongClick呢,这个还是比较少用到吧,建议分成两个,
一个setOnItemClickListener
一个setOnItemLongClickListener

删除headerView

建议添加 删除指定position或者view的 api功能,有时候添加多个header,操作时会选择删除部分

getItemViewDelegate判断

public ItemViewDelegate getItemViewDelegate(T item, int position) { int delegatesCount = delegates.size(); for (int i = delegatesCount - 1; i >= 0; i--) { ItemViewDelegate<T> delegate = delegates.valueAt(i); if (delegate.isForViewType(item, position)) { return delegate; } } throw new IllegalArgumentException( "No ItemViewDelegate added that matches position=" + position + " in data source"); }
这个方法根据item以及position通过isForViewType判断是哪一个Delegate,但是如果有大于2种类型的话,isForViewType的返回值是布尔类型的,就不够用了。

项目导入android studio 失败

Error:failed to find Build Tools revision 23.0.0 rc3 <a href="install.build.tools">Install Build Tools 23.0.0 rc3 and sync project</a>
错误提示。点击之后的的错误弹窗提示:

All packages are not available for download!  The following packages are not available:
- Package id build-tools;23.0.0-preview

ps:我的是可以直接翻墙的,所以应该不是网络环境的问题

多个子布局的情况

鸿洋大神。我把代码邮箱发你了。希望能指点一下因为有个毛病改不过来:(

横向recyclerview的使用

当使用横向recyclerview的时候,可能会动态设置itemView的大小(比如我一个屏幕只显示3列),能不能提供一个方法设置呢 一般的adapter是在onCreateViewHolder那里设置View的layoutparams的

加入包装类,会出现刷新数据无反应的现象!

   mEmptyWrapper = new EmptyWrapper(mAdapter);
    mEmptyWrapper.setEmptyView(R.layout.empty_view);
   1. recycleview.setAdapter(mAdapter);
   2.// recycleview.setAdapter(mEmptyWrapper);
   如果是第一种写法不加包装类是没问题的,notifyDataSetChanged(); 界面及时更新
   如果是第二种写法,那么界面不会有反应,需在往下拖动,然后拖回来,界面才会有刷新

获取position

请问怎么获取absListView中当前的position,没有暴露方法呢

刷新ListView不成功

当获取到比前一次更多的数据的时候,直接使用adapter.notifyDataSetChanged();刷新界面,无法正确显示。而在MultiItemTypeAdapter类中添加了下面这个方法,然后重新传入之后,就可以正确显示。
public void setDatas(List datas){
this.mDatas = datas;
this.notifyDataSetChanged();
}
如果没有添加这个方法,而是直接对存储数据的集合进行添加进数据,然后再调用adapter.notifyDataSetChanged();并没有效果。更多的是需要在上拉加载更多的时候使用

感觉是复用的问题

适配器里面用 glide 加载图的时候 ,上下滑动,图片一会大一会小,ImageView的大小在变化。感觉像是item 的复用的问题。

建议添加 显示“加载更多”的 footerView 视图。

鸿洋,以前一直用com.joanzapata.android:base-adapter-helper,感觉挻好用,但不支持多布局和RecyclerView,GridView之类的。
您这个很不错,建议添加上显示“加载更多”的 footerView 视图,毕竟这个项目中这个功能一般都通用。

header浮动效果

嗨,鸿神,打扰了;昨天看到您新封装的对RecyclerView的通用adapter;其中的可以添加分类header的那种情况;我现在有个需求:实现header浮动(下一个header推走上一个header,同时header上有按钮能够点击),这种在您这个封装基础上如何实现?麻烦您给指点指点,谢谢

加载更多时,动态显示更多的布局

当采用LoadMoreWrapper时,有时会根据服务器返回的数据来判断有没有下一页,如果没有的话,需要隐藏掉 loadMoreView,能否提供一个api实现呢

支持一下分页加载,动态的修改数据。

在CommonAdapter中添加操作数据的函数?

public void addAll(Collection<? extends T> collections) {
datas.addAll(collections);
}

public void add(T t) {
    datas.add(t);
}

public void add(int position, T t) {
    datas.add(position, t);
}

public void clear() {
    datas.clear();
}

添加 header和footer的时候 View获取不到parent

   View footer = LayoutInflater.from(getContext()).inflate(R.layout.view_agio_footer, null);
    headerAndFooterWrapper.addFootView(footer);

view_agio_footer里面的布局不能居中,因为在activity 里面 拿不到parent

onLoadMoreRequested方法一开始就会调用?

mLoadMoreWrapper.setLoadMoreView(R.layout.item_universal_more);
mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener(){
            @Override
            public void onLoadMoreRequested(){

        });

一开始就在加载,这个不应该是滑动到最底部才触发吗?

加载不同种类的网络数据时,数据请求下来了,但显示会慢好几秒?

adapter = new MultiItemTypeAdapter(getActivity(), data);
adapter.addItemViewDelegate(new HotNewSalesItemDelagate());
adapter.addItemViewDelegate(new HotSalesItemDelagate());

    View header_view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_hot_new_header, null);
    initHeaderView(header_view);
    wrapper = new HeaderAndFooterWrapper(adapter);
    wrapper.addHeaderView(header_view);

    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);

    recyclerView.setAdapter(wrapper);
    wrapper.notifyDataSetChanged();

多种布局文件改进观点

刚开始用github,不太怎么会弄fork,见谅
多种Item的时候不明白为什么要考虑抽出一个接口,然后再重新弄一个类,这样是不是把类弄太多了不好,
我个人把她整到一块了,请鸿神点评。
public abstract class CommonAdapter extends BaseAdapter {
/**
* 上下文对象
/
protected Context context;
/
*
* 单Item的时候,Item xml的ID
/
protected int layoutItemID;
/
*
* Item填充数据
*/
protected List lDatas;

/**
 * 多Item时构造函数
 *
 * @param context 山下文
 * @param lDatas  Item数据集
 */
public CommonAdapter(Context context, List<T> lDatas) {
    this.context = context;
    this.lDatas = lDatas;
}

/**
 * 单Item Type时构造函数
 *
 * @param context      上下文
 * @param lDatas       Item数据集
 * @param layoutItemID Item xml布局文件ID
 */
public CommonAdapter(Context context, List<T> lDatas, int layoutItemID) {
    this.context = context;
    this.lDatas = lDatas;
    this.layoutItemID = layoutItemID;
}

@Override
public int getCount() {
    return lDatas.size();
}

@Override
public T getItem(int position) {
    return lDatas.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return layoutItemID;
}

@Override
public int getViewTypeCount() {
    return 1;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int itemID = getItemViewType(position);
    ViewHolder holder = ViewHolder.getInstance(context, convertView,
            parent, itemID, position);

    getViewItem(holder, getItem(position));

    return holder.getConvertView();
}

/**
 * 给每个Item设置数据
 *
 * @param holder holder句柄对象
 * @param item   item每一项数据值
 */
public abstract void getViewItem(ViewHolder holder, T item);

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.