使用CursorLoader更新ListView是一种从数据库向UI显示数据的简单方法.模型修改传播到UI而没有额外的工作,可能不那么有效.
RecyclerView.adapter提供更多粒度的访问权限,允许例如指定删除特定项目的适配器.
但是,调用那些首选方法(notifyItem*),替换notifyDataSetChanged的最佳位置是什么?
显然,适配器不能观察contentProvider,否则它将不知道模型修改的性质(就像之前一样).
可以使用不同的模式,例如添加总线以发布来自提供者的修改,创建可以使用适配器的引用的单例模型,可以使用演示者(在L中引入),或者创建活动绑定服务.
这是一个常见的用例:同步进程在DB中插入一个条目(或者收到一个gcm通知,也在DB中插入一个条目),然后我希望通过调用notifyItemInserted来更新UI(如果已启动).在哪里拨打这个电话?
谢谢.
我想创建每个列表项的recyclerview具有自定义的行垂直.
但我创建列表项然后行不显示.
custom_line
line_story_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="match_parent">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#EEEEEE"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:id="@+id/line_test" />
<View android:layout_width="10dp"
android:layout_height="10dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="45dp"
android:background="@drawable/bg_test_line" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
项目清单
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<RelativeLayout
android:layout_width="95dp"
android:layout_height="wrap_content"
android:id="@+id/relativeLayout67">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/rv_profile"
android:layout_width="48dp"
android:layout_height="48dp"
app:riv_border_color="#cacaca"
app:riv_corner_radius="2dip"
android:src="@drawable/plachholder"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp" />
<TextView
android:id="@+id/tvwTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Loading..."
android:textAppearance="@style/AppTheme.TextAppearance"
android:textColor="#a3a3a3"
android:textSize="12dp"
android:layout_below="@+id/rv_profile"
android:layout_alignLeft="@+id/rv_profile"
android:layout_alignStart="@+id/rv_profile"
android:layout_marginTop="10dp" />
<com.example.bestiiz.component.LineStoryView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/line" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" …Run Code Online (Sandbox Code Playgroud) android recycler-adapter android-recyclerview recyclerview-layout
我的适配器列表在广播接收器上刷新.
如果适配器列表大小大于1,一切正常工作,意味着如果我的recyclerview已经有一行shwoing然后列表刷新就好了.但是如果列表大小从0变为1,那么我的适配器通知数据集已更改停止工作.在recyclerview上没有数据显示.我不知道为什么它不起作用.
Recyclerview类:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.job_recyclerview, container, false);
getActivity());
initialise(v);
init();
showNoTaskMessage();
new loadListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
mMyBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Here you can refresh your listview or other UI
SlidingTab.slidingTab.getTabAt(0).setText("New (" + SingleTon.getInstance().getNewjob() + ")");
SlidingTab.slidingTab.getTabAt(1).setText("In Progress (" + SingleTon.getInstance().getInprogressjob() + ")");;
SlidingTab.slidingTab.getTabAt(2).setText("Completed (" + SingleTon.getInstance().getCompletedjob() + ")");
}
};
try {
IntentFilter filter = new IntentFilter("newJob");
LocalBroadcastManager.getInstance(context).registerReceiver(mMyBroadcastReceiver,
filter);
} catch (Exception …Run Code Online (Sandbox Code Playgroud) android notifydatasetchanged recycler-adapter android-recyclerview
我正在java.lang.IndexOutOfBoundsException: Inconsistency detected使用RecyclerView,但是只有在我似乎将其扔掉时才使用。当我滚动得足够慢时,它不会崩溃。
我将基本适配器用于许多其他子类,但是只有某些子类会崩溃。知道为什么会这样吗?
编辑
我发现发生这种情况的原因是因为getItemCount()更改取决于页脚加载视图的状态。我相信这会导致更改和滚动时出现不一致。
我通过始终在getItemCount()中的页眉/页脚加载视图返回2个额外的项来进行测试。而不是根据其状态动态计算计数。解决此问题的好方法是什么?
我的适配器
public abstract class BaseRecyclerAdapter<T>
extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements LoadingAndErrorViewHolder.LoadingViewHolderListener {
public static final int STATUS_HIDDEN = 0;
public static final int STATUS_LOADING = 1;
public static final int STATUS_ERROR = 2;
protected static final int TYPE_HEADER_LOADING = 0;
protected static final int TYPE_FOOTER_LOADING = 1;
protected static final int TYPE_NORMAL = 2;
private static final int POSITION_TYPE_HEADER_LOADING = 0;
private BaseRecyclerAdapterListener mBaseRecyclerAdapterListener;
private final List<T> mBackingList = …Run Code Online (Sandbox Code Playgroud) android indexoutofboundsexception recycler-adapter android-recyclerview
我有一个RecyclerView我在下面得到例外的地方.我只是在Crashlytics上获得了例外,尽管我每天都在大量使用这项活动,但我自己从未设法重现这个问题.
我夸大其观点的方式onCreateViewHolder是:
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
Run Code Online (Sandbox Code Playgroud)
还有另一种视图类型,它来自MoPub原生广告.
知道问题是什么吗?
Caused by java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the childs parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4438)
at android.view.ViewGroup.addView(ViewGroup.java:4274)
at android.view.ViewGroup.addView(ViewGroup.java:4215)
at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:711)
at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7877)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7835)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7823)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1565)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1325)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1061)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4726)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:894)
at android.view.Choreographer.doCallbacks(Choreographer.java:696)
at android.view.Choreographer.doFrame(Choreographer.java:628)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:880)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) …Run Code Online (Sandbox Code Playgroud) android android-viewholder recycler-adapter android-recyclerview
我在应用中创建了可扩展的回收视图,如下所示
它具有父项目菜单类别,而类别具有子项目,如图所示
以下是我的父适配器代码的一部分。
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if (i > HEADER_COUNT - 1) {
FoodMenuItem foodMenuItem = foodMenuItems.get(i - HEADER_COUNT);
MenuViewHolder menuViewHolder = (MenuViewHolder) viewHolder;
//menuViewHolder.rvMenu.setLayoutManager(new LinearLayoutManager(viewHolder.itemView.getContext(), LinearLayoutManager.VERTICAL, false));
if (isVegOnly) {
List<Item> items = new ArrayList<>();
for (Item item : foodMenuItem.getItems()) {
if (item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG)) {
items.add(item);
}
}
menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(items, foodMenuParentListener, i, isAddAllowed));
menuViewHolder.tvNumItems.setText("(" + items.size() + " items)");
} else {
menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(foodMenuItem.getItems(), foodMenuParentListener, i, isAddAllowed));
menuViewHolder.tvNumItems.setText("(" + foodMenuItem.getItems().size() + " items)"); …Run Code Online (Sandbox Code Playgroud) android recycler-adapter android-recyclerview expandablerecyclerview android-nestedscrollview
我有一个水平的Recyclerview,显示位图.它的实施方式是我在它下面有一个Imageview和一个Recyclerview.当前选择的项目显示在图像视图中.所选图像视图的背景为蓝色,表示已选中.我可以从图库中选择图像,每次选择新图像时,我想滚动到最后一个位置并选择项目.
图像列表保存在数组列表中,每次添加新图像时,我都会将图像添加到列表中并通知notifyDataChanged().
目前,当我绑定视图时,我切换了蓝色背景的可见性
public void onBindViewHolder(final MyRecyclerViewHolder holder,int position){}
但问题是,如果孩子不在屏幕上,则不会调用绑定视图,我也不会滚动到新位置.我阅读了Recycler视图的文档,但无法弄清楚如何滚动到特定的子视图.我没有SmoothScrollTo方法,但我的问题是我在哪里触发它?
为什么推荐使用static的class扩展从RecyclerView.ViewHolder,如果我创建这个类的一个新的实例onCreateViewHolder方法,我想该实例用于每个项目:
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview,parent,false);
return new RecyclerViewAdapter.RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
String textTop = noticias.get(position).getHora()+ noticias.get(position).getTemperatura();
holder.textViewTop.setText(textTop);
holder.textViewBot.setText(noticias.get(position).getTexto());
}
public static class RecyclerViewHolder extends RecyclerView.ViewHolder{
public TextView textViewTop;
public TextView textViewBot;
public RecyclerViewHolder(View view){
super(view);
textViewTop = (TextView) view.findViewById(R.id.textView4);
textViewBot = (TextView) view.findViewById(R.id.textView5);
}
}
Run Code Online (Sandbox Code Playgroud) android android-viewholder recycler-adapter android-recyclerview
我已经使用了ArrayList<>和JsonArray作为适配器中的数据集.我发现的一个主要区别是适配器中本地数据的数据集更改没有反映在JsonArray的调用类中.
我想知道哪一个更好,我的观察是正确的.
此外,如果我的数据集涉及从Web服务中提取数据(这给我提供Json表单数据),那么我将其更改为ArrayList <>会更好.
当您滚动浏览RecyclerView时,我不明白刹车的原因是什么。mRecyclerView.smoothScrollToPosition(position);
在抽搐列表中滚动时调用滚动(渲染时间范围> 16ms)
AlphaAdapter.java
public class AlphaAdapter extends RecyclerView.Adapter<AlphaAdapter.ViewHolder> {
private static final String TAG = "AlphaAdapter";
private Context mContext;
private List<PrimaryWeapon> mGunList;
private boolean isAnimate;
private final int VIEW_TYPE_NULL = 0;
private final int VIEW_TYPE_ITEM = 1;
public AlphaAdapter(Context mContext, List<PrimaryWeapon> mGunList) {
this.mContext = mContext;
this.mGunList = mGunList;
}
public AlphaAdapter(Context mContext, List<PrimaryWeapon> mGunList, boolean a) {
this.mContext = mContext;
this.mGunList = mGunList;
this.isAnimate = a;
}
@Override
public int getItemViewType(int position) {
try {
if (mGunList.get(position).getNameWeapon().equals("")) …Run Code Online (Sandbox Code Playgroud) java android android-studio recycler-adapter android-recyclerview