Articles of recycler adapter

当使用Runnable从Handler使用notifyItemChanged时,RecyclerView会崩溃

我使用RecyclerView作为列表来显示可以下载的歌曲。 每个项目的View都有ProgressBar 。 下载开始时,我使用Handler通知每个项目更新ProgressBar以显示歌曲下载进度。 Q1。 这是一种正确的方法,还是有其他方法可以更恰当地做到这一点。 Q2。 当我们使用adapter.notifyItemChanged(position);时,RecyclerView会崩溃adapter.notifyItemChanged(position); 更新单个项目的内容。 它是使用Runnable从Handler调用的。 但是,日志不会显示我的代码的任何痕迹。 为什么? 以下是此问题的日志: 05-06 19:09:45.804: E/AndroidRuntime(32115): FATAL EXCEPTION: main 05-06 19:09:45.804: E/AndroidRuntime(32115): java.lang.IllegalArgumentException: Tmp detached view should be removed from RecyclerView before it can be recycled: ViewHolder{41b7bec0 position=6 id=-1, oldPos=-1, pLpos:-1 update changed tmpDetachedundefined adapter position no parent} 05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:3861) 05-06 19:09:45.804: […]

使用多种视图types在recyclerview中滚动到底部

我有一个包含多个项目的recyclerview。 和recyclerview有不同的视图types和不同的高度.. 所以这些是我尝试过的 recyclerview.scrollToPosition(adapterWrapper.getAdapter().getItemCount()-1); 和 app:layoutManager=”LinearLayoutManager” app:stackFromEnd=”true” 当我仅在单一视图types上应用它们时,它们对我很有用。但在多视图types中。 它不是滚动到底部。 它被困在底部之前的9个项目。 我stackFromBottom在listview中使用stackFromBottom并且工作正常.. 那么在recyclerview中它的解决方案是什么? 它实际上是一个聊天应用程序,具有不同types的布局,包括图像,GIF等。 RecyclerAdapter代码, package com.buckydroid.anonchat.Adapters; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.URLUtil; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; import com.buckydroid.anonchat.Async.DownloadManager; import com.buckydroid.anonchat.Chatroom.ChatRoom; import com.buckydroid.anonchat.Pages.FullScreenImageView; import com.buckydroid.anonchat.Pages.Profile; import […]

如何在android中的RecyclerView项目之间添加动态视图?

我需要在RecyclerView的项目之间添加一个小条带。 此条带可以在列表中的不同数量的项目之后。 这需要动态完成。 我需要实现FitBit所做的事情: 我还需要第一行,即即使页面向下滚动,也可以将“本周”放在顶部。

RecyclerView StaggeredGridLayoutManager重新排序问题

我试图在带有两列的StaggeredGridLayoutManager的RecyclerView显示三个(至少我遇到问题)。 第一项跨越两行。 这是它的样子: 现在,我将项目“项目2”移到顶部。 这是我在适配器中调用的代码(这是我编写的一个示例,用于演示我在一个更复杂的项目中遇到的问题): private int findById(int id) { for (int i = 0; i < items.size(); ++i) { if (items.get(i).title.equals("Item " + id)) { return i; } } return -1; } // Moving the item "Item 2" with id = 2 and position = 0 public void moveItem(int id, int position) { final […]

RecyclerView:如何清除缓存/回收的视图?

我使用RecyclerView显示具有列表布局的项目列表。 我从列表布局切换到网格布局,在网格布局中仅显示所有数据的子集。 此开关使用与列表布局呈现时不同的布局XML。 所有这一切都很好,除了当我滚动,回收(缓存?)列表布局视图填充网格,与适当的网格布局视图项混合。 换句话说,我不是在layout_grid.xml为每个项目的布局使用我的layout_grid.xml ,而是使用layout_grid.xml布局获取项目,但是采用网格格式。 这告诉我LayoutManager工作正常,从列表切换到网格布局。 但并非所有项目视图项都使用网格xml布局重新创建,而是使用回收列表布局视图。 我试过RecyclerView.removeAllViews() , RecyclerView.removeAllViewInLayout() , RecyclerView.swapAdapter() (强制适配器重新加载),都无济于事。 更新: 如果我在列表中向下滚动两个位置,然后从列表切换到网格,前两个位置不通过onCreateViewHolder(),而是直接到onBindViewHolder(),因此不会强制使用网格布局xml。 相反,前两个位置项目被回收(我认为)并以列表布局格式显示。

StaggeredGridLayoutManager和移动项目

我创建了一个非常简单的项目,通过recyclerview使用StaggeredGridLayoutManager显示28个图像。 但是当我滚动Recyclerview时,它会移动项目,例如从左向右移动或交换左右列。 代码: import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; public class MainActivity extends Activity { String mImageDir; private RecyclerView mRecyclerView; private StaggeredGridLayoutManager mLayoutManager; MyRecyclerAdapter myRecyclerAdapter; List mImageList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview_rootview); mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); mLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setHasFixedSize(false); mImageList = new ArrayList(); […]

RecyclerView和适配器数据更新

对于了解其机制或愿意深入了解源代码的人来说,这是一个关于RecyclerView内部行为的问题。 我想通过引用源代码来支持答案。 原始问题 (向下滚动到’换句话说’以获得更集中的问题) 我需要了解notify* actions(例如, notifyItemInserted() )是如何入队的。 想象一下,我有一个由此列表备份的适配器: ArrayList list = Arrays.asList(“one”, “three”, “four”); 我想添加zero和two值,缺少值。 例1 list.add(1, “two”); // notify the view adapter.notifyItemInserted(1); // Seconds later, I go on with zero list.add(0, “zero”); // notify the view adapter.notifyItemInserted(0); 这非常简单明了,没什么好说的。 例2 但是,如果这两个动作彼此非常接近,并且两者之间没有布局传递怎么办? list.add(1, “two”); list.add(0, “zero”); 我现在应该怎么做? adapter.notifyItemInserted(1); adapter.notifyItemInserted(0); 或者可能 adapter.notifyItemInserted(2); adapter.notifyItemInserted(0); ? 从适配器的角度来看,列表立即从one, three, […]

RecyclerView适配器采用错误的值

我有一个RecyclerView显示两种View一种代表User发布,另一种代表Event发布。 两者都有共同的元素,例如显示时间戳的TextView 。 所以我创建了一个PublicationViewHolder ,它将TextView时间戳记转换为variables并加载它。 我的问题是适配器最初加载正确的值,但是当我向下滚动并再次向上滚动时,位置中的值会被其他位置的值更改。 这是代码: public class PublicationViewHolder extends RecyclerView.ViewHolder { private TextView vTimeStamp; public PublicationViewHolder(View itemView) { super(itemView); this.vTimeStamp = (TextView) itemView.findViewById(R.id.txt_view_publication_timestamp); } public void load(Publication publication, int i) { load(publication); try { if (Publication.TYPE_USER_PUBLICATION == publication.getType()) { load((UserPublication) publication); } else if (Publication.TYPE_EVENT_PUBLICATION == publication.getType()) { load((EventPublication) publication); } } catch […]

扩充类RecyclerView时出错

所以我的代码只使用RecyclerView创建了一个CardView列表。 运行我的代码后,我一直收到一个奇怪的错误,声称我的xml中有错误。 经过修补一段时间后,我发现在我的布局文件中如果我将更改为一切都会正常工作。 为什么会这样? 我的活动。 import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import java.util.ArrayList; public class CardListActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_card_list); RecyclerView recyclerView = (RecyclerView)findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); ArrayList list = new ArrayList(); for(int i = 0; i […]

使用Android LiveData更新RecyclerView

有很多例子如何推动新的列表适配器LiveData的变化。 我试图更新一行(例如发表评论的数量)在巨大的列表中。 重置整个列表只会改变一个字段将是愚蠢的。 我能够添加观察者在BindViewHolder,但我不明白什么时候应该删除观察者 @Override public void onBindViewHolder(ViewHolder vh, int position) { Post post = getPost(position); vh.itemView.setTag(post); post.getLiveName().observeForever(vh.nameObserver); … }