2016-11-29 22 views
1

我試圖從我的Recycler適配器onClick按鈕中打開一個對話框。 爲此,我需要使用getFragmentManager方法獲取FragmentManager,該方法只能在活動對象的幫助下調用。IllegalStateException在使用活動對象的幫助下訪問RecyclerAdapter類中的FragmentManager

這裏是我的代碼:

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"); 


     } 
    } 
} 

內RecyclerAdapter2的構造我傳遞從我的MainActivity的Java文件的活動背景:

MainActivity.java:

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

Inside RecyclerAdapter2構造函數i將上下文分配給Activity類的對象。

而比我使用的對象來獲取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,並且應該使用如下所示的接口向您的片段發送回調函數,或者也可以使用thisthis中的BaseAdapter。

public interface OnItemClickListener { 
     void onItemClick(View v); 
    } 

    private final OnItemClickListener listener; 

    public RecAdapter(OnItemClickListener listener) { 
     this.listener = listener; 
    } 

    public ViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.onItemCLick(v); 
      } 
     }); 
    }