2016-11-29 46 views
1

RecyclerアダプタのボタンからonClickというダイアログボックスを開こうとしています。 そのためには、私は、GetFragmentManagerメソッドを使用してFragmentManagerを取得する必要があります。このメソッドは、アクティビティオブジェクトの助けを借りてのみ呼び出すことができます。ここでアクティビティのオブジェクトの助けを借りてRecyclerAdapterクラス内のFragmentManagerにアクセス中にIllegalStateExceptionが発生しました

私のコードです:

RecyclerAdapter2:

MainActivity.java:

RecyclerAdapter2のコンストラクタ内

package com.example.batrad.expenseassist; 

    import android.app.Activity; 
    import android.app.FragmentManager; 
    import android.content.Context; 
    import android.media.Image; 
    import android.support.v7.widget.RecyclerView; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ImageView; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import java.util.Collections; 
    import java.util.List; 

    /** 
    * Created by batrad on 11/18/2016. 
    */ 

public class RecyclerAdapter2 extends RecyclerView.Adapter<RecyclerAdapter2.MyViewHolder> { 
    List<Information2> data = Collections.emptyList(); 
    private LayoutInflater inflator; 
    Activity activity; 
    FragmentManager fm; 

    public RecyclerAdapter2(Context context, List<Information2> data) { 
     activity=(Activity)context; 
     inflator = LayoutInflater.from(context); 
     this.data = data; 
     fm=activity.getFragmentManager(); 


    } 

    @Override 
    public RecyclerAdapter2.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view =inflator.inflate(R.layout.recycler_row_category,parent,false); 
     MyViewHolder holder=new MyViewHolder(view); 
     return holder; 

    } 

    @Override 
    public void onBindViewHolder(RecyclerAdapter2.MyViewHolder holder, int position) { 
     Log.d("tag",data.get(0)+""); 
     Information2 info=data.get(position); 
     Log.d("testre",info.categoryName+info.amount); 
     holder.categoryName.setText(info.categoryName); 
     holder.amount.setText(info.amount+""); 
     holder.categoryImage.setImageResource(info.categoryImage); 

    } 

    public void onInsert(int size){ 
     notifyItemInserted(size); 

    } 



    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     TextView categoryName; 
     TextView amount; 
     ImageView categoryImage; 
     ImageView deleteIcon; 
     ImageView addIcon; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      categoryName=(TextView) itemView.findViewById(R.id.categoryName); 
      amount=(TextView) itemView.findViewById(R.id.amount); 
      categoryImage=(ImageView) itemView.findViewById(R.id.categoryImage); 
      deleteIcon=(ImageView) itemView.findViewById(R.id.deleteIcon); 
      addIcon=(ImageView) itemView.findViewById(R.id.addIcon); 
      addIcon.setOnClickListener(this); 

     } 

     @Override 
     public void onClick(View view) { 

      SubCategoryDialog subCategoryDialog=new SubCategoryDialog(); 
      SubCategoryDialog.setValues(data.get(getAdapterPosition()).categoryName); 
      subCategoryDialog.show(fm, "Create Category"); 


     } 
    } 
} 

私はMainActivity Javaファイルからのアクティビティのコンテキストを渡しています

categoryrecycleAdapter = new RecyclerAdapter2(this, getdata()); 

内部RecyclerAdapter2コンストラクタiアクティビティクラスのオブジェクトにコンテキストを割り当てます。

私はfragmentManagerを取得するためにオブジェクトを使用しています。 しかし、私は、ここではIllegalStateExceptionを取得しています:

java.lang.IllegalStateException: Activity has been destroyed 
                         at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1433) 
                         at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687) 
                         at android.app.BackStackRecord.commit(BackStackRecord.java:663) 
                         at android.app.DialogFragment.show(DialogFragment.java:230) 
                         at com.example.batrad.expenseassist.RecyclerAdapter2$MyViewHolder.onClick(RecyclerAdapter2.java:85) 
                         at android.view.View.performClick(View.java:5233) 
                         at android.view.View$PerformClick.run(View.java:21209) 
                         at android.os.Handler.handleCallback(Handler.java:739) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:152) 

助けてください。

+0

クリックをリッスンし、アクティビティで実装するインターフェイスを使用します。必要な場合は、 –

答えて

0

これは、リスナーを接続する正しい方法ではありません。ビューホルダのコンストラクタでonClickListenerを設定し、以下のようにインタフェースを使用してフラグメントにコールバックを送信するか、thisまたはthisのBaseAdapterを使用する必要があります。

関連する問題