2017-12-23 8 views
1

私は、私のrecyclerlerviewをクリックして、その情報をrecyclerviewに表示する方法を見つけるためにどこからでも検索してきました。私はリストとインテントを使ってデータを渡す多くのソリューションを見てきましたが、私の問題はSQLiteDatabaseをビットマップイメージと2つの文字列値で使用していることです。そのデータを別のアクティビティにどのように渡す必要がありますか?ここで各RecyclerViewの詳細アクティビティを作成する

は、私がこれまで持っているものである:(CustomAdapterクラス)

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.TaskHolder> { 

    private Cursor mCursor; 
    private OnItemClickListener mOnItemClickListener; 
    private Context mContext; 

    /* Callback for list item click events */ 
    public interface OnItemClickListener { 
     void onListItemClick(int clickedItemIndex); 
    } 

    public CustomAdapter(Context mContext) { 
     this.mContext = mContext; 
    } 

    public CustomAdapter() 
    { 
     mContext = null; 
    } 





    /* ViewHolder for each task item */ 
    public class TaskHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView shoeBrandName; 
     public TextView shoeName; 
     public ImageView shoeImage; 

     public TaskHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(this); 

      shoeBrandName = (TextView) itemView.findViewById(R.id.textBrandName); 
      shoeImage = (ImageView) itemView.findViewById(R.id.shoeImage); 
      shoeName = (TextView) itemView.findViewById(R.id.textShoeName); 



     } 

     @Override 
     public void onClick(View v) { 

     } 


    } 

    @Override 
    public TaskHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     View itemView = inflater 
       .inflate(R.layout.text_row_item, parent, false); 
     return new TaskHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(TaskHolder holder, int position) { 



     int idIndex = mCursor.getColumnIndex(DatabaseContract.ShoeColumns._ID); 
     int imgValue = mCursor.getColumnIndex(DatabaseContract.ShoeColumns.SHOE_IMAGE); 
     int shoeBrandName = mCursor.getColumnIndex(DatabaseContract.ShoeColumns.SHOE_BRAND); 
     int shoeName = mCursor.getColumnIndex(DatabaseContract.ShoeColumns.SHOE_NAME); 

     mCursor.moveToPosition(position); 



     final int id = mCursor.getInt(idIndex); 
     byte[] shoeImg = mCursor.getBlob(imgValue); 
     String brandNameStr = mCursor.getString(shoeBrandName); 
     String shoeNameStr = mCursor.getString(shoeName); 

     Bitmap bmp = BitmapFactory.decodeByteArray(shoeImg, 0, shoeImg.length); 

     holder.itemView.setTag(id); 
     holder.shoeImage.setImageBitmap(Bitmap.createScaledBitmap(bmp, 100, 100, false)); 
     holder.shoeBrandName.setText(brandNameStr); 
     holder.shoeName.setText(shoeNameStr); 



    } 

    @Override 
    public int getItemCount() { 
     return (mCursor != null) ? mCursor.getCount() : 0; 
    } 


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

    } 
} 

DetailsActivity:

package com.example.android.myshoecloset; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ShoeDetailActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_shoe_detail); 

     ImageView imgShoe = (ImageView) findViewById(R.id.shoeImgDetails); 
     TextView brandShoe = (TextView) findViewById(R.id.shoeBrandDetails); 
     TextView nameShoe = (TextView) findViewById(R.id.shoeNameDetails); 
    } 
} 

クローゼットクラス(クローゼットの中にあるものを定義)

import android.database.Cursor; 
import android.os.Parcel; 
import android.os.Parcelable; 

/** 
* Created by man on 12/21/2017. 
*/ 

public class Closet implements Parcelable 
{ 


    private static final String TAG = Closet.class.getSimpleName(); 

    //Brand name 
    private final String brandName; 
    //Shoe Name 
    private final String shoeName; 
    //Image of the shoe 
    private final String shoeImage; 


    public Closet(String brandName, String shoeName, String shoeImage) 
    { 
     this.brandName = brandName; 
     this.shoeName = shoeName; 
     this.shoeImage = shoeImage; 
    } 

    public Closet(Cursor cursor) 
    { 
     this.brandName = null; 
     this.shoeName = null; 
     this.shoeImage = null; 
    } 

    protected Closet(Parcel in) 
    { 
     this.brandName = in.readString(); 
     this.shoeName = in.readString(); 
     this.shoeImage = in.readString(); 
    } 

    public String getShoeImageName() 
    { 
     return shoeImage; 
    } 

    public String getBrandName() 
    { 
     return brandName; 
    } 

    public String getShoeName() 
    { 
     return shoeName; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) 
    { 
     dest.writeString(brandName); 
     dest.writeString(shoeName); 
     dest.writeString(shoeImage); 
    } 

    @Override 
    public int describeContents() 
    { 
     return 0; 
    } 

    public static final Creator<Closet> CREATOR = new Creator<Closet>(){ 
     @Override 
     public Closet createFromParcel(Parcel in) 
     { 
      return new Closet(in); 
     } 
     @Override 
     public Closet[] newArray(int size) 
     { 
      return new Closet[size]; 
     } 
    }; 

} 

そのリサイクラービューの内容を各リサイクルビューの内容を保存することなく情報を取得する方法はありますかリスト?

+0

like-任意の場所からのアクセスこのyourBitmapあなたが必要なプロパティを持つ靴クラスを作成し、そのクラスのSerializableインタフェースを実装することができます。次に、インテントを作成して詳細アクティビティーを開き、その中に靴オブジェクトを入れます。 – Cristian

+0

私は実際に靴のクラスを作成しました、申し訳ありません、私はそれを追加することを忘れました。 –

+0

私はそれをどうやって行うことができるかの例を示してもらえますか? –

答えて

0

をこれらの変数にアクセス お勧めしませんあなたが考える必要があるものの

まず、新しいアクティビティにデータを渡します。

インテントを作成してエクストラとして追加することができます。アクティビティでは、そのエクストラを取得して使用することができます。あなたのクリックイベント

Intent intent = new Intent(context, YourActivity.class); 
intent.putExtra("closet_key", closetObject); 

INとで

あなたの活動のonCreate()

Closet closetObject = getIntent().getParcelableExtra("closet_key"); 
// Use your object 

しかし、これはオブジェクトが中に大きい場合ので、あなたは、小さなオブジェクト、軽量を持っていた場合に適切ですあなたがどちらかを取得するサイズ

  • あなたの活動のゆっくりした遅れた開始あなたの意思サイズは、Android

別のオプションによって許可されたサイズを超えたため

  • やクラッシュが起きているシリアル化プロセスは、唯一の活動への識別子のいくつかの並べ替えを渡し、ロードするためにその識別子を使用することですアクティビティーのオブジェクト。したがって、DB IDを渡して、そのオブジェクトをアクティビティーに照会することができます。

    Bitmapsのような大きなオブジェクトの場合は、そこから任意のライブラリを使用して、取得と自動キャッシュを行うことができます。また、バイト配列全体ではなく、DBのイメージのURLまたはパスを保持するだけで済みます。

    これを行うのに役立つ図書館はPicassoまたはGlideであり、それ以上のものがあります。それらは単純であるとわかり、仕事をうまくやってくれます。

  • 0

    1つの簡単な解決策が、カップルがありますリサイクラービューアダプタクラスの静的変数を作成し、アイテム上でこれらの変数に値を割り当てる]をクリックし、クラス名で呼び出す次のアクティビティから

    +0

    これを行う方法の例を表示できますか? –

    +0

    答えを見てください。 –

    0
    public static Bitmap yourBitmap; 
        public class MovementListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    ... 
    //assign value to **yourBitmap** on item click 
        yourBitamp = imageBitmap; 
    } 
    

    imageView.setImageBitmap(YourRecyclerViewAdapter.yourBitmap); 
    
    関連する問題