2017-02-22 7 views

答えて

0

下記のリンクでカーソルアダプタの実装を見つけてくださいまた、私はリンクの下にコードを入れて、それはあなたを助けるかもしれません。

Recycler view with cursor adapter

すべてCursorAdapterの第一は、RecyclerViewで使用するために設計されていません。あなたはそこで正しく動作しないものをハックしようとしています。メソッドを呼び出すだけで、関数が正しく機能することは期待できません。ソースを参照してください。

だからまず最初に物事。我々はカーソルを使用したい。この責任を分けてRecyclerViewCursorAdapterを作成する。これはRecyclerViewのCursorAdapterというものです。これの詳細はCursorAdapterの動作とほぼ同じです。何が同じで何が違うのかを知るには、その出典を見てください。

次に、オリジナルのRecyclerViewCursorAdapterを実装する元のクラスRVAdapterを用意しました。これは、onCreateViewHolderと私たちにバインドするCursorパラメータを与える新しい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); 
     } 
    } 
} 

RecyclerViewCursorAdapter.java

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(); 
     } 
    }; 
} 
関連する問題