kaleai / commonadapter Goto Github PK
View Code? Open in Web Editor NEW通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter
License: Apache License 2.0
通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter
License: Apache License 2.0
没有兼容横向 LayoutManager
private void setFullSpan(@Nullable View view, RecyclerView.LayoutManager layoutManager) {
if (view != null) {
int itemWidth = view.getLayoutParams() != null ?
view.getLayoutParams().height : RecyclerView.LayoutParams.WRAP_CONTENT;
int itemHeight = view.getLayoutParams() != null ?
view.getLayoutParams().height : RecyclerView.LayoutParams.WRAP_CONTENT;
if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams layoutParams =
new StaggeredGridLayoutManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, itemHeight);
layoutParams.setFullSpan(true);
view.setLayoutParams(layoutParams);
//1. GridLayoutManager extend LinearLayoutManager ,不必要的类型判断
//2. 当布局是横向滚动时,应该时 height 设为MatchParent
//} else if (layoutManager instanceof GridLayoutManager
// || layoutManager instanceof LinearLayoutManager) {
} else if (layoutManager instanceof LinearLayoutManager) {
if (((LinearLayoutManager) layoutManager).getOrientation() == LinearLayoutManager.VERTICAL) {
itemWidth = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
itemHeight = ViewGroup.LayoutParams.MATCH_PARENT;
}
view.setLayoutParams(new RecyclerView.LayoutParams(itemWidth, itemHeight));
}
notifyDataSetChanged();
}
}
public abstract class CommonRcvAdapter<T> extends RecyclerView.Adapter<CommonRcvAdapter.RcvAdapterItem>
泛型的内部类,很多泛型方法没法 overrideimport kale.commonadapter.databinding.DemoItemImageBinding;
这个类没有找到哦。是不是被删了?
demo中的imageview,buttonview,textview都是DemoModel
- 由于adapter只提供了setData方法设置数据,因此在下拉刷新和加载更多我想要插入/删除数据的时候只能自己重新组装出一个List来setData,多有不便,建议adapter增加addData和removeData的公共方法
- 在版本更新说明中有提到“支持适配器的数据自动绑定,只用操作数据便可自动notify界面”,基于这点我把代码中最后一行的notify注释掉,结果出现数据错位问题,反复上下滑动列表几次才会显示正常,放开注释就一切正常,还请查证原因,谢谢
public void onData(List<Book> books) { if (books == null) return; switch (refreshType) { // 设置新的数据 case TYPE_NORMAL: adaper.setData(books); break; case TYPE_REFRESH: /*实际是这样的:重新组装数据源 List a = adaper.getData(); a.addAll(0, books); adaper.setData(a);*/ // adaper.addData(0, books);期望是这样的 recyclerView.refreshComplete(); break; case TYPE_LOADMORE: List b = adaper.getData(); b.addAll(adaper.getItemCount(), books); adaper.setData(b); // adaper.addData(adaper.getItemCount(), books); recyclerView.loadMoreComplete(); break; } adaper.notifyDataSetChanged(); // 通知数据刷新 }
复现路径:
初始化不设置数据,仅仅设置底部
异步加载网络,调用list的addAll方法添加数据
使用的是 ObservableArrayList
1.1.4之後又做了更新
與1.1.4相比有了大幅度的改動
何時會釋出呢?
能不能加一个删除item功能
有种情况:某个item包含另一个item,这种情况如何处理呢?
不知道有没有碰到这个问题。RcvAdapterItem会缓存很多。正常情况下只有2个缓存。不知道哪里出现内存泄漏导致Pool中 RcvAdapterItem 很快的积累很多。
正在修复,修复完毕后会 给出demo。
为什么, 我下拉刷新也会触发OnRcvScrollListener 的 onBottom 方法 ~
�疑惑好久了
一般来说,这种情况下,recyclerview不是会完全看不到么?
看了你的代码,也没找到相关处理的地方,求指导。
谢谢啦
Error:Could not find com.github.tianzhijiexian:CommonAdapter:Latest release.
Required by:
Breaktrip1:app:unspecified
Search in build.gradle files``
问题如下
CommonRcvAdapter
@Override
public void handleData(Object o, int position) {
Glide.with(mFrg).load("http://xxx.png").into(imageview);
}
也就是在单个item里面使用Glide加载图片,本来图片宽match_parent
,高135dp
固定值。
这样程序内存一直增加,看情况是view不停在绘制。注释加载图片代码,情况恢复正常。
如题 ~
点击了某个item 对应的DemoModel 也要进行update 有什么好办法吗
Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.
最新的版本 1.1.9 中 没有ExRcvAdapterWrapper 这个类
觉得AdapterModel 的getDataTypeCount()好像多余,总觉得没有用,修改了效果业是一样,能说说当初设计这个的初衷不呢。Demo中给,那个返回是3,随便修改效果业是一样,没有两样,感到很疑惑
return new SetDefaultCardListAdapter(mContext, new SetDefaultCardListAdapter.CardItemSelCallback() {
@Override
public void onItemCardSelClick(int position) {
LogUtils.i(TAG,"position " + position);
for (int i = 0; i < data.size(); i++) {
if (i == position) {
data.get(i).setSel(true);
} else {
data.get(i).setSel(false);
}
}
idRecyclerview.getAdapter().notifyDataSetChanged();
}
});
没事看了下,东西不错,不过发现listView的adapter是不是有复用的现象 ,好像有点问题
可否增加recyclerviewAdater的单选多选功能
你好,我在使用您提供的CommonRcvAdapter时,按照Demo的例子自定义,改写了一下布局,但是现在有个问题,RecyclerView经常不会把数据加载完全,很多时候都只能加载一部分,另外的显示的全是空白。请问这是什么原因引起的呢?
加载代码:
final List data = DataManager.loadData(MainActivity.this);
Log.i(TAG, "data.size = " + data.size()); //size显示是正常的
((CommonRcvAdapter) mRecyclerView.getAdapter()).setData(data); // 设置新的数据
mRecyclerView.getAdapter().notifyDataSetChanged(); // 通知数据刷新
demo和例子好像都没
我是在adapterItem初始化的时候对view设置一个clickListener, 然后传入一个interface做点击事件的响应,但是发现没有方法可以获取到这个item所对应的data,我应该如何实现比较好?
打了Log看了下,发现如果有多少行数据,那个函数就会执行多少次,这样会降低性能吗?
不是什么大问题,只是每次new CommonxxAdapter的时候,createItem方法的参数是一个Object o,看起来有点迷惑
但是我看好像不会啊,我是没有用dataBinding的,而是用的butterknife。
我在一开始将adapter用null的data创建了,然后listview.setadapter,拿到数据之后我再adapter.setData,然而ListView并没有反应
@Deprecated
@Override
public int getItemViewType(int position) {
mItemType = getItemType(mDataList.get(position));
return mUtil.getIntType(mItemType);
}
@Override
public Object getItemType(T t) {
return -1; // default
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new RcvAdapterItem(parent.getContext(), parent, createItem(mItemType));
}
@SuppressWarnings("unchecked")
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
debug((RcvAdapterItem) holder);
((RcvAdapterItem) holder).item.handleData(getConvertedData(mDataList.get(position), mItemType), position);
}
@tianzhijiexian CommonRcvAdapte的onBindViewHolder 方法里面直接用mItemType,没调用getItemViewType,会不会有问题?
作者有什么更好的想法吗?
或者比如加一个默认的OnItemClick回调?
我看例子程序只有在初始化的时候传入List,在获取数据过程中有没有接口来刷新数据?
在item中添加一个按钮的Click监听,会传递给item,还会打开item
加载数据是在handleData中,那么Glide获取上下文只能从bindView获取了吗
有这样一个需求,通过Item的构造函数传入一个T1类型数据,然后Item指定的泛型是T,现在update或者setData的时候,只能改T,请问怎么改T1呢?
当前这个库依赖失败。我这边有缓存可以,其他工程我试了下都不行,任何版本。其他同事那边试过也不行,连接不上。昨天打包还OK的。
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
data.clear();
data.addAll(DataManager.loadData(getBaseContext()));
}
}, 1000);
getItemView中有initItem会一直创建新的对象 导致内存一直增加
好像造成了死循环导致的,
引用:
mRecyclerView = (RecyclerView) findViewById(R.id.rcv);
mRecyclerView.setLayoutManager(new GridLayoutManager(RCVActivity.this, 2));
这里引发的问题:
ExRcvAdapterWrapper.class:
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return (ViewHolder)(viewType == 99930?new ExRcvAdapterWrapper.SimpleViewHolder(this.mHeaderView):(viewType == 99931?new ExRcvAdapterWrapper.SimpleViewHolder(this.mFooterView):this.mWrapped.onCreateViewHolder(parent, viewType)));
}
报错:
ERR: stack=java.lang.StackOverflowError: stack size 8MB
at kale.adapter.CommonRcvAdapter.getItemType(CommonRcvAdapter.java:109)
at kale.adapter.CommonRcvAdapter.getItemViewType(CommonRcvAdapter.java:103)
项目中没有引用databinding包,就会提示ObserverList找不到,我代码这样使用
mList = new ArrayList<>(); mAdapter = new CommonRcvAdapter<DeviceModel>(mList) { @NonNull public AdapterItem createItem(Object o) { return new DeviceItem(); } }; mRecyclerView.setAdapter(mAdapter);
就提示错误了,app的build.gradle导入了provided 'com.android.databinding:baseLibrary:1.0'才能通过编译,有没有办法不让我自己导这个包的?因为项目没有用到这个包
设置成GridLayoutManager / StaggeredGridLayoutManager 不会占据一列
我看了代码是你有做处理的, 可是不生效~
test
该如何是好
在使用TabLayout时发现没有getPageTitle的重写,但加上这个会破坏通用性,斟酌加入。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.