Java 我可以在RecyclerView中将光标适配器与GridView一起使用吗

Java 我可以在RecyclerView中将光标适配器与GridView一起使用吗,java,android,android-layout,Java,Android,Android Layout,我正在构建一个图片应用程序,其中包含指向描述的链接。如果使用电影数据库作为电影缩略图和描述数据的源,带有光标适配器的GridViewRecyclerView是否是一种合适的方法。请在下面的链接中找到光标适配器的实现我还将代码放在链接下面,这可能会对您有所帮助 首先,CursorAdapter不是为与RecyclerView一起使用而设计的。你正在尝试破解一些永远不会正常工作的东西。你不能仅仅调用它的方法,期望它能正常工作。见来源 所以首先要做的事。我们想用光标。。让我们分离这个责任并创建Rec

我正在构建一个图片应用程序,其中包含指向描述的链接。如果使用电影数据库作为电影缩略图和描述数据的源,带有光标适配器的
GridView
RecyclerView
是否是一种合适的方法。

请在下面的链接中找到光标适配器的实现我还将代码放在链接下面,这可能会对您有所帮助

首先,CursorAdapter不是为与RecyclerView一起使用而设计的。你正在尝试破解一些永远不会正常工作的东西。你不能仅仅调用它的方法,期望它能正常工作。见来源

所以首先要做的事。我们想用光标。。让我们分离这个责任并创建RecycleServiceUrsorAdapter。这就是它所说的,一个游标适配器,一个循环视图。其细节与CursorAdapter的工作原理基本相同。看看它的来源,看看什么是相同的,什么是不同的

接下来,我们将使用原始类RVAdapter来实现抽象的RecycleWebCursorAdapter,它要求我们实现onCreateViewHolder和新的onBindViewHolder,后者为我们提供了一个要绑定的游标参数。这些视图的细节与您的原始视图相同,只是稍微整理了一下

RVAdapter.java

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.Random;


public class RVAdapter extends RecyclerViewCursorAdapter<RVAdapter.ProductViewHolder>
{
    private static final String TAG = RVAdapter.class.getSimpleName();
    private final Context mContext;
    private final Random mRandom;


    public RVAdapter(Context context, String locationSetting)
    {
        super(null);
        mContext = context;
        mRandom  = new Random(System.currentTimeMillis());

        // Sort order:  Ascending, by date.
        String sortOrder = ProductContract.ProductEntry.COLUMN_DATE + " ASC";
        Uri productForLocationUri = ProductContract.ProductEntry
            .buildProductLocationWithStartDate(locationSetting, System.currentTimeMillis());

        // Students: Uncomment the next lines to display what what you stored in the bulkInsert
        Cursor cursor = mContext.getContentResolver()
            .query(productForLocationUri, null, null, null, sortOrder);

        swapCursor(cursor);
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
        return new ProductViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(ProductViewHolder holder, Cursor cursor)
    {
        String imagePath = cursor.getString(ShopFragment.COL_PRODUCT_IMAGE);
        String price = cursor.getString(ShopFragment.COL_PRODUCT_PRICE);

        holder.productPrice.setText("US $" + price);

        int height = mRandom.nextInt(50) + 500;

        //Download image using picasso library
        Picasso.with(mContext)
            .load(imagePath)
            .resize(500, height)
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(holder.productPhoto);
    }


    public static class ProductViewHolder extends RecyclerView.ViewHolder
    {
        CardView cv;
        TextView productPrice;
        ImageView productPhoto;

        ProductViewHolder(View itemView)
        {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cv);
            productPrice = (TextView) itemView.findViewById(R.id.product_price);
            productPhoto = (ImageView) itemView.findViewById(R.id.product_photo);
        }
    }
}
import android.database.Cursor;
import android.database.DataSetObserver;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;


/**
 * RecyclerView CursorAdapter
 * <p>
 * Created by Simon on 28/02/2016.
 */
public abstract class RecyclerViewCursorAdapter<VH extends RecyclerView.ViewHolder> extends
    RecyclerView.Adapter<VH>
{
    private Cursor mCursor;
    private boolean mDataValid;
    private int mRowIDColumn;


    public RecyclerViewCursorAdapter(Cursor cursor)
    {
        setHasStableIds(true);
        swapCursor(cursor);
    }

    public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

    protected abstract void onBindViewHolder(VH holder, Cursor cursor);

    @Override
    public void onBindViewHolder(VH holder, int position)
    {
        if(!mDataValid){
            throw new IllegalStateException("this should only be called when the cursor is valid");
        }
        if(!mCursor.moveToPosition(position)){
            throw new IllegalStateException("couldn't move cursor to position " + position);
        }
        onBindViewHolder(holder, mCursor);
    }

    @Override
    public long getItemId(int position)
    {
        if(mDataValid && mCursor != null && mCursor.moveToPosition(position)){
            return mCursor.getLong(mRowIDColumn);
        }
        return RecyclerView.NO_ID;
    }

    @Override
    public int getItemCount()
    {
        if(mDataValid && mCursor != null){
            return mCursor.getCount();
        }
        else{
            return 0;
        }
    }

    protected Cursor getCursor()
    {
        return mCursor;
    }

    public void changeCursor(Cursor cursor)
    {
        Cursor old = swapCursor(cursor);
        if(old != null){
            old.close();
        }
    }

    public Cursor swapCursor(Cursor newCursor)
    {
        if(newCursor == mCursor){
            return null;
        }
        Cursor oldCursor = mCursor;
        if(oldCursor != null){
            if(mDataSetObserver != null){
                oldCursor.unregisterDataSetObserver(mDataSetObserver);
            }
        }
        mCursor = newCursor;
        if(newCursor != null){
            if(mDataSetObserver != null){
                newCursor.registerDataSetObserver(mDataSetObserver);
            }
            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
            mDataValid = true;
            notifyDataSetChanged();
        }
        else{
            mRowIDColumn = -1;
            mDataValid = false;
            notifyDataSetChanged();
        }
        return oldCursor;
    }


    private DataSetObserver mDataSetObserver = new DataSetObserver()
    {
        @Override
        public void onChanged()
        {
            mDataValid = true;
            notifyDataSetChanged();
        }

        @Override
        public void onInvalidated()
        {
            mDataValid = false;
            notifyDataSetChanged();
        }
    };
}
导入android.content.Context;
导入android.database.Cursor;
导入android.net.Uri;
导入android.support.v7.widget.CardView;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.squareup.picasso.picasso;
导入java.util.Random;
公共类RVAdapter扩展了RecycleServiceUrsorAdapter
{
私有静态最终字符串标记=RVAdapter.class.getSimpleName();
私有最终上下文mContext;
私有最终随机域;
公共RVAdapter(上下文、字符串位置设置)
{
超级(空);
mContext=上下文;
mRandom=新随机(System.currentTimeMillis());
//排序顺序:按日期升序。
字符串排序器=ProductContract.ProductEntry.COLUMN_DATE+“ASC”;
Uri productForLocationUri=ProductContract.ProductEntry
.buildProductLocationWithStartDate(locationSetting,System.currentTimeMillis());
//学生:取消注释下一行以显示您在bulkInsert中存储的内容
Cursor Cursor=mContext.getContentResolver()
.query(productForLocationUri,null,null,null,sortOrder);
swapCursor(游标);
}
@凌驾
公共产品ViewHolder onCreateViewHolder(视图组父级,int-viewType)
{
View=LayoutInflater.from(parent.getContext())
.充气(右布局项,父项,假);
返回新的ProductViewHolder(视图);
}
@凌驾
BindViewHolder上的受保护无效(ProductViewHolder,光标)
{
String imagePath=cursor.getString(ShopFragment.COL\u PRODUCT\u IMAGE);
String price=cursor.getString(ShopFragment.COL\u PRODUCT\u price);
holder.productPrice.setText(“US$”+价格);
内部高度=mRandom.nextInt(50)+500;
//使用毕加索库下载图像
毕加索(McContext)
.load(图像路径)
.调整大小(500,高度)
.错误(R.drawable.placeholder)
.placeholder(R.drawable.placeholder)
.into(holder.productPhoto);
}
公共静态类ProductViewHolder扩展了RecyclerView.ViewHolder
{
卡德维尤简历;
文本视图产品价格;
ImageView产品照片;
ProductViewHolder(查看项目视图)
{
超级(项目视图);
cv=(cardwiew)itemView.findviewbyd(R.id.cv);
productPrice=(TextView)itemView.findViewById(R.id.product\u price);
productPhoto=(ImageView)itemviewbyd(R.id.product\u photo);
}
}
}
RecycleServiceUrsorAdapter.java

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.Random;


public class RVAdapter extends RecyclerViewCursorAdapter<RVAdapter.ProductViewHolder>
{
    private static final String TAG = RVAdapter.class.getSimpleName();
    private final Context mContext;
    private final Random mRandom;


    public RVAdapter(Context context, String locationSetting)
    {
        super(null);
        mContext = context;
        mRandom  = new Random(System.currentTimeMillis());

        // Sort order:  Ascending, by date.
        String sortOrder = ProductContract.ProductEntry.COLUMN_DATE + " ASC";
        Uri productForLocationUri = ProductContract.ProductEntry
            .buildProductLocationWithStartDate(locationSetting, System.currentTimeMillis());

        // Students: Uncomment the next lines to display what what you stored in the bulkInsert
        Cursor cursor = mContext.getContentResolver()
            .query(productForLocationUri, null, null, null, sortOrder);

        swapCursor(cursor);
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
        return new ProductViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(ProductViewHolder holder, Cursor cursor)
    {
        String imagePath = cursor.getString(ShopFragment.COL_PRODUCT_IMAGE);
        String price = cursor.getString(ShopFragment.COL_PRODUCT_PRICE);

        holder.productPrice.setText("US $" + price);

        int height = mRandom.nextInt(50) + 500;

        //Download image using picasso library
        Picasso.with(mContext)
            .load(imagePath)
            .resize(500, height)
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(holder.productPhoto);
    }


    public static class ProductViewHolder extends RecyclerView.ViewHolder
    {
        CardView cv;
        TextView productPrice;
        ImageView productPhoto;

        ProductViewHolder(View itemView)
        {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cv);
            productPrice = (TextView) itemView.findViewById(R.id.product_price);
            productPhoto = (ImageView) itemView.findViewById(R.id.product_photo);
        }
    }
}
import android.database.Cursor;
import android.database.DataSetObserver;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;


/**
 * RecyclerView CursorAdapter
 * <p>
 * Created by Simon on 28/02/2016.
 */
public abstract class RecyclerViewCursorAdapter<VH extends RecyclerView.ViewHolder> extends
    RecyclerView.Adapter<VH>
{
    private Cursor mCursor;
    private boolean mDataValid;
    private int mRowIDColumn;


    public RecyclerViewCursorAdapter(Cursor cursor)
    {
        setHasStableIds(true);
        swapCursor(cursor);
    }

    public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

    protected abstract void onBindViewHolder(VH holder, Cursor cursor);

    @Override
    public void onBindViewHolder(VH holder, int position)
    {
        if(!mDataValid){
            throw new IllegalStateException("this should only be called when the cursor is valid");
        }
        if(!mCursor.moveToPosition(position)){
            throw new IllegalStateException("couldn't move cursor to position " + position);
        }
        onBindViewHolder(holder, mCursor);
    }

    @Override
    public long getItemId(int position)
    {
        if(mDataValid && mCursor != null && mCursor.moveToPosition(position)){
            return mCursor.getLong(mRowIDColumn);
        }
        return RecyclerView.NO_ID;
    }

    @Override
    public int getItemCount()
    {
        if(mDataValid && mCursor != null){
            return mCursor.getCount();
        }
        else{
            return 0;
        }
    }

    protected Cursor getCursor()
    {
        return mCursor;
    }

    public void changeCursor(Cursor cursor)
    {
        Cursor old = swapCursor(cursor);
        if(old != null){
            old.close();
        }
    }

    public Cursor swapCursor(Cursor newCursor)
    {
        if(newCursor == mCursor){
            return null;
        }
        Cursor oldCursor = mCursor;
        if(oldCursor != null){
            if(mDataSetObserver != null){
                oldCursor.unregisterDataSetObserver(mDataSetObserver);
            }
        }
        mCursor = newCursor;
        if(newCursor != null){
            if(mDataSetObserver != null){
                newCursor.registerDataSetObserver(mDataSetObserver);
            }
            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
            mDataValid = true;
            notifyDataSetChanged();
        }
        else{
            mRowIDColumn = -1;
            mDataValid = false;
            notifyDataSetChanged();
        }
        return oldCursor;
    }


    private DataSetObserver mDataSetObserver = new DataSetObserver()
    {
        @Override
        public void onChanged()
        {
            mDataValid = true;
            notifyDataSetChanged();
        }

        @Override
        public void onInvalidated()
        {
            mDataValid = false;
            notifyDataSetChanged();
        }
    };
}
导入android.database.Cursor;
导入android.database.DataSetObserver;
导入android.support.v7.widget.RecyclerView;
导入android.view.ViewGroup;
/**
*循环视图游标适配器
*
*由Simon于2016年2月28日创建。
*/
公共抽象类RecycleWebCursorAdapter扩展
RecyclerView.适配器
{
私有游标mCursor;
私有布尔mDataValid;
私有int-mRowIDColumn;
公共回收服务UrsorAdapter(光标)
{
setHasStableIds(true);
swapCursor(游标);
}
公共抽象VH onCreateViewHolder(视图组父级,int-viewType);
BindViewHolder上受保护的摘要无效(VH holder,光标);
@凌驾
公共无效onBindViewHolder(VH holder,内部位置)
{
如果(!mDataValid){
抛出新的IllegalStateException(“仅当光标有效时才应调用它”);
}
如果(!mCursor.moveToPosition(位置)){
抛出新的IllegalStateException(“无法将光标移动到位置”+位置);
}
onBindViewHolder(holder,mCursor);
}
@凌驾
公共长getItemId(int位置)
{
if(mDataValid&&mCursor!=null&&mCursor.moveToPosition(位置)){
返回mCursor.getLong(mRowIDColumn);
}
返回RecyclerView.NO\u ID;
}
@凌驾
public int getItemCount()
{
if(mDataValid&&mCursor!=null){
返回mCursor.getCount();
}
否则{
返回0;
}
}
受保护的游标getCursor()
{
返回mCursor;
}
公共void changeCursor(游标)
{
游标old=swapCursor(游标);
如果(旧!=null){
old.close();
}
}
公共游标交换游标(游标新建游标)
{
if(newCursor==mCursor){
返回null;
}
游标oldCursor=mCursor;
如果(oldCursor!=n