当我尝试填充 RecyclerView 时,我经常遇到错误,但错误似乎发生在 StaggeredGridLayoutManager 内部。
我从我的数据库中填充 RecyclerView,然后使用这个将图像添加到我的适配器
List<WImage> images;
public void addImages(LinkedHashMap<Integer,WImage> newImages){
for(Map.Entry<Integer,WImage> entry : newImages.entrySet()){
addImage(entry.getValue(),entry.getKey());
}
}
public void addImage(WImage image, int position){
images.add(position,image);
notifyItemRangeInserted(position, 1);
}
奇怪的是,当应用程序首次加载时它很好并正确显示所有内容,但如果我根据数据库查询将 RecyclerView 中当前的内容替换为一组不同的图像,然后再次返回初始图像,我得到这个错误。
java.lang.ArrayIndexOutOfBoundsException: src.length=16 srcPos=0 dst.length=0 dstPos=0 length=16
at java.lang.System.arraycopy(Native Method)
at android.support.v7.widget.StaggeredGridLayoutManager$LazySpanLookup.ensureSize(StaggeredGridLayoutManager.java:2277)
at android.support.v7.widget.StaggeredGridLayoutManager$LazySpanLookup.offsetForAddition(StaggeredGridLayoutManager.java:2323)
at android.support.v7.widget.StaggeredGridLayoutManager.handleUpdate(StaggeredGridLayoutManager.java:1280)
at android.support.v7.widget.StaggeredGridLayoutManager.onItemsAdded(StaggeredGridLayoutManager.java:1253)
at android.support.v7.widget.RecyclerView$5.dispatchUpdate(RecyclerView.java:406)
at android.support.v7.widget.RecyclerView$5.onDispatchSecondPass(RecyclerView.java:422)
at android.support.v7.widget.AdapterHelper.consumePostponedUpdates(AdapterHelper.java:119)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1896)
at android.support.v7.widget.RecyclerView.resumeRequestLayout(RecyclerView.java:1101)
at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:155)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
它很好地浏览了所有图像,但是当它准备好再次调用 onBindViewHolder 时它崩溃了。
当我更改 RecyclerView 中的数据时,我先删除所有内容,然后再填充查询中的新数据
public void removeAll(){
images.clear();
notifyDataSetChanged();
}
我也试过一次全部插入它们,然后用起始位置和图像总数调用 notifyItemRangeInserted,但它仍然因同样的错误而崩溃。
编辑
当我点击大约 20 个左右需要放入网格的项目时,它似乎会发生。如果我只是使用 notifyDatasetChanged 它似乎工作正常但我想使用 notifyItemRangeInserted 所以我得到了漂亮的插入动画
还有其他人遇到过这个问题吗?
EDIT2
这是我的onCreateViewHolder
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.image_normal_grid_cell, viewGroup, false);
return new ViewHolder(v);
}
和我的onBindViewHolder
@Override
public void onBindViewHolder(final ViewHolder holder, final int i) {
final WImage image = images.get(i);
holder.v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v,i,image);
}
});
holder.heart.setActivated(image.getLikeDislike());
holder.heart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri.Builder ub = SyncProvider.CONTENT_ID_URI_BASE.buildUpon();
ub.appendPath(String.valueOf(image.getId()));
ContentValues values = new ContentValues();
if(image.getLikeDislike()){
values.put(SyncProvider.LIKE,0);
holder.heart.setActivated(false);
image.setLikeDislike(false);
}else{
values.put(SyncProvider.LIKE,1);
holder.heart.setActivated(true);
image.setLikeDislike(true);
}
values.put(SyncProvider.IMAGE_CHANGED,1);
context.getContentResolver().update(ub.build(),values,null,null);
}
});
if(cancelPotentialDownload(image.getUri(),holder.imageview)){
LoadImageTask task = new LoadImageTask(holder.imageview,image.getThumbUri());
holder.imageview.setImageDrawable(new AsyncBitmap(task));
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
编辑 3
这是我更换适配器时所做的
在我的抽屉导航的选定索引更改时,我初始化我的加载程序以进行查询
public void initLoader(int page){
if(currentPage != page && mAdapter != null){
mAdapter.removeAll();
hashImages.clear();
getLoaderManager().destroyLoader(currentPage);
}
currentPage = page;
getLoaderManager().initLoader(page,null,this);
}
然后在加载程序的 onLoadFinished 中将对象添加到适配器
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if(cursor != null && cursor.moveToFirst()){
do{
WImage image = new WImage(cursor);
if(!hashImages.containsKey(image.getId())){
newImages.put(tempHash.size(),image);
}else if(image.getImageChanged()){
update = true;
}
int pos = tempHash.size();
tempHash.put(image.getId(),pos);
}while(cursor.moveToNext());
}
if(newImages.size() > 0){
mAdapter.addImages(newImages);
}
最佳答案
Google 在 21.0.2 版本中已解决此错误:
compile "com.android.support:support-v4:21.0.2"
compile "com.android.support:recyclerview-v7:21.0.2"
关于android - 填充 RecyclerView 时出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26662525/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
我最近对我的计算机(OS-MacOSX10.6.8)进行了删除,并且我正在重新安装我所有的开发工具。我再次安装了RVM;但是,它不会让我安装Ruby1.9.3。到目前为止我已经尝试过:rvminstall1.9.3rvm安装1.9.3-p194rvm安装1.9.3-p448rvminstall1.9.3--with-gcc=clang所有返回相同的命令行错误:Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.6/x86_64/ruby-1.9.3-p448.Continuin
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
我刚刚安装了Sphinx(发行版:archlinux)并下载了源代码。然后我为Rails安装了“ThinkingSphinx”插件。我关注了officialpagesetup和thisScreencastfromRyanBates,但是当我尝试为模型建立索引时,出现了这个错误:$rakethinking_sphinx:index(in/home/benoror/Dropbox/Proyectos/cotizahoy)Sphinxcannotbefoundonyoursystem.Youmayneedtoconfigurethefollowingsettingsinyourconfig/