Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么DBFlow Feed RecyclerView在Marshmallow中得到更新,但在M之前没有更新?_Android_Android Layout_Android Sqlite_Android Recyclerview_Dbflow - Fatal编程技术网

Android 为什么DBFlow Feed RecyclerView在Marshmallow中得到更新,但在M之前没有更新?

Android 为什么DBFlow Feed RecyclerView在Marshmallow中得到更新,但在M之前没有更新?,android,android-layout,android-sqlite,android-recyclerview,dbflow,Android,Android Layout,Android Sqlite,Android Recyclerview,Dbflow,我试图显示从(SQLite)后端馈送的RecyclerView列表。列表中的每个项目表示一个项目,一旦选中该项目,该项目将转换为详细信息活动视图。与任何游标加载程序一样,我希望每次在支持视图的加载程序中发生更改时,布局都会自动更新 当在棉花糖中测试时,这是正确的,但在棒棒糖和果冻豆中都没有这样做(4.3)。在失败的情况下,尽管在调试器中看到onBindViewHolder()会为每个项调用一次(顺便说一句,正确的数据到达光标),但列表中会显示单个项 以下是我的观点中涉及的主要内容。我故意简化了代

我试图显示从(SQLite)后端馈送的RecyclerView列表。列表中的每个项目表示一个项目,一旦选中该项目,该项目将转换为详细信息活动视图。与任何游标加载程序一样,我希望每次在支持视图的加载程序中发生更改时,布局都会自动更新

当在棉花糖中测试时,这是正确的,但在棒棒糖和果冻豆中都没有这样做(4.3)。在失败的情况下,尽管在调试器中看到onBindViewHolder()会为每个项调用一次(顺便说一句,正确的数据到达光标),但列表中会显示单个项

以下是我的观点中涉及的主要内容。我故意简化了代码,如有必要,请随时索取更多详细信息:


onResume()覆盖显示列表的活动:

@Override
protected void onResume() {
    super.onResume();

    getSupportLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
        @Override
        public Loader<Cursor> onCreateLoader(int arg0, Bundle cursor) {
            return BackendManager.getListCursorLoader(mContext);
        }

        @Override
        public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
            int numItemsRetrieved = cursor.getCount();
            if ((numItemsRetrieved == 1) {
                Optional<Item> selectedItemOpt = BackendManager.getSingleItem();

                if (selectedItemOpt.isPresent()) {
                    Item selectedItem = selectedItemOpt.get();

                    Intent t = new Intent(mContext, ItemDetailActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable("item", selectedItem);
                    it.putExtras(b);
                    startActivityForResult(it, SHOW_ITEM_DETAIL);
                }
            }

            ((ItemListRecyclerAdapter) mRecyclerListView.getAdapter()).swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> arg0) {
            ((ItemListRecyclerAdapter) mRecyclerListView.getAdapter()).swapCursor(null);
        }
    });
}
public static CursorLoader getListCursorLoader(Context ctx) {
    return new CursorLoader(
            ctx,                                            // Context
            Item.CONTENT_URI,                               // Uri
            null,                                           // Projection
            null,                                           // Selection
            null,                                           // selectionArgs
            null                                            // sortOrder
    );
}
public class ItemListRecyclerAdapter extends CursorRecyclerViewAdapter<ItemListRecyclerAdapter.ViewHolder> {

    private Context mContext;

    public ItemListRecyclerAdapter(Context context, Cursor cursor) {
        super(context, cursor);

        mContext = context;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView itemText;
        public ImageView itemImage;

        public ViewHolder(View view) {
            super(view);
            itemText = (TextView) view.findViewById(R.id.itemTitle);
            itemImage = (ImageView) view.findViewById(R.id.itemPicture);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_6_list_item, parent, false);
        ViewHolder vh = new ViewHolder(itemView);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {

        // Find fields to populate in inflated template
        String itemTextData = cursor.getString(cursor.getColumnIndex("itemText"));
        viewHolder.itemText.setText(itemTextData);
        // Force text fit
        AutofitHelper afh = AutofitHelper.create(viewHolder.itemText);
        afh.setMaxTextSize(TypedValue.COMPLEX_UNIT_SP, 22.0f);

        String itemImageUrl = cursor.getString(cursor.getColumnIndex("logo"));
        if ((itemImageUrl != null) && (!itemImageUrl.isEmpty())) {
            Picasso.with(mContext)
                    .load(itemImageUrl)
                    .resize(300, 300)
                    .centerCrop()
                    .placeholder(R.drawable.placeholder)
                    .into(viewHolder.itemImage);
        } else {
            viewHolder.itemImage.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.placeholder));
        }
    }
}

用于游标的RecyclerView适配器。当前使用:

@Override
protected void onResume() {
    super.onResume();

    getSupportLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
        @Override
        public Loader<Cursor> onCreateLoader(int arg0, Bundle cursor) {
            return BackendManager.getListCursorLoader(mContext);
        }

        @Override
        public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
            int numItemsRetrieved = cursor.getCount();
            if ((numItemsRetrieved == 1) {
                Optional<Item> selectedItemOpt = BackendManager.getSingleItem();

                if (selectedItemOpt.isPresent()) {
                    Item selectedItem = selectedItemOpt.get();

                    Intent t = new Intent(mContext, ItemDetailActivity.class);
                    Bundle b = new Bundle();
                    b.putSerializable("item", selectedItem);
                    it.putExtras(b);
                    startActivityForResult(it, SHOW_ITEM_DETAIL);
                }
            }

            ((ItemListRecyclerAdapter) mRecyclerListView.getAdapter()).swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> arg0) {
            ((ItemListRecyclerAdapter) mRecyclerListView.getAdapter()).swapCursor(null);
        }
    });
}
public static CursorLoader getListCursorLoader(Context ctx) {
    return new CursorLoader(
            ctx,                                            // Context
            Item.CONTENT_URI,                               // Uri
            null,                                           // Projection
            null,                                           // Selection
            null,                                           // selectionArgs
            null                                            // sortOrder
    );
}
public class ItemListRecyclerAdapter extends CursorRecyclerViewAdapter<ItemListRecyclerAdapter.ViewHolder> {

    private Context mContext;

    public ItemListRecyclerAdapter(Context context, Cursor cursor) {
        super(context, cursor);

        mContext = context;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView itemText;
        public ImageView itemImage;

        public ViewHolder(View view) {
            super(view);
            itemText = (TextView) view.findViewById(R.id.itemTitle);
            itemImage = (ImageView) view.findViewById(R.id.itemPicture);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_6_list_item, parent, false);
        ViewHolder vh = new ViewHolder(itemView);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {

        // Find fields to populate in inflated template
        String itemTextData = cursor.getString(cursor.getColumnIndex("itemText"));
        viewHolder.itemText.setText(itemTextData);
        // Force text fit
        AutofitHelper afh = AutofitHelper.create(viewHolder.itemText);
        afh.setMaxTextSize(TypedValue.COMPLEX_UNIT_SP, 22.0f);

        String itemImageUrl = cursor.getString(cursor.getColumnIndex("logo"));
        if ((itemImageUrl != null) && (!itemImageUrl.isEmpty())) {
            Picasso.with(mContext)
                    .load(itemImageUrl)
                    .resize(300, 300)
                    .centerCrop()
                    .placeholder(R.drawable.placeholder)
                    .into(viewHolder.itemImage);
        } else {
            viewHolder.itemImage.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.placeholder));
        }
    }
}
公共类ItemListRecyclerAdapter扩展了CursorRecyclServiceAdapter{
私有上下文;
public ItemListRecyclerAdapter(上下文上下文,光标){
超级(上下文、游标);
mContext=上下文;
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本查看项目文本;
公共图像查看项目图像;
公共视图持有者(视图){
超级(视图);
itemText=(TextView)view.findViewById(R.id.itemTitle);
itemImage=(ImageView)view.findViewById(R.id.itemPicture);
}
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.activity\u 6\u list\u项,父项,false);
ViewHolder vh=新的ViewHolder(项目视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder、ViewHolder、光标){
//查找要在模板中填充的字段
String itemTextData=cursor.getString(cursor.getColumnIndex(“itemText”);
viewHolder.itemText.setText(itemTextData);
//强制文本匹配
AutofitHelper afh=AutofitHelper.create(viewHolder.itemText);
afh.setMaxTextSize(TypedValue.COMPLEX\u UNIT\u SP,22.0f);
String itemImageUrl=cursor.getString(cursor.getColumnIndex(“徽标”);
如果((itemImageUrl!=null)&&(!itemImageUrl.isEmpty()){
毕加索(McContext)
.load(itemImageUrl)
.调整大小(300300)
.centerCrop()
.placeholder(R.drawable.placeholder)
.into(viewHolder.itemImage);
}否则{
viewHolder.itemImage.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.placeholder));
}
}
}
如上所述,这已通过以下方式进行测试和验证:

  • Nexus 6上的棉花糖(6.0.1):正在工作
  • Galaxy S5上的棒棒糖(5.0):不工作
  • Galaxy S3上的果冻豆(4.3):不工作

我是不是遗漏了什么?有没有关于进一步研究的提示?

由于没有任何答案,我将解释我最终如何解决这个问题

在完全重写之后,我去掉了skyfish的光标适配器,并全力使用Android的RecyclerView界面。我没有使用游标/适配器方案从SQLite后端提取数据,并在底层存储发生更改时交换游标,而是在storage manager中启用了get all items静态方法来检索最新数据。为了在数据发生更改时更新列表,我使用DBFlow获得此类更改的通知。一旦检测到更改,我将使用get all items检索更新的数据,并相应地更新RecyclerView,执行适当的notifyItem()调用以设置布局更改的动画


无需在Android&DBFlow之外附加依赖项或代码。此方法已在原始问题中描述的所有设备中得到验证。

如果可能,请提供一些正在实施的示例代码。我目前正在构建此模式,以模仿iOS中使用的coredata fetchedresultscontroller模式,根据订阅db更新自动更新UI。