【问题标题】:How to open Fragment OnClickListener如何打开片段 OnClickListener
【发布时间】:2016-05-09 15:44:26
【问题描述】:

我正在尝试打开一个新片段但收到错误:

无法解析 getFragmentManager

我尝试了一些解决方案,但仍然出现错误。我该如何解决?

这是我设置OnClickListener的适配器代码:

public class RecyclerViewDataAdapter extends RecyclerView.Adapter<RecyclerViewDataAdapter.ViewHolder> {
private Context context;
public ImageLoader mImageLoader;

//List of superHeroes
List<ListOfData> superHeroes;

public RecyclerViewDataAdapter(List<ListOfData> superHeroes, Context context) {
    super();
    //Getting all the superheroes
    this.superHeroes = superHeroes;
    this.context = context;

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recyclerview_row, parent, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    ListOfData superHero = superHeroes.get(position);

    mImageLoader = MyApplication.getInstance().getImageLoader();
    mImageLoader.get(superHero.getImageUrl(), ImageLoader.getImageListener(holder.imageView1, R.mipmap.ic_launcher, android.R.drawable.ic_dialog_alert));
    holder.imageView1.setImageUrl(superHero.getImageUrl(), mImageLoader);
    holder.textViewName1.setText(superHero.getName());
    //holder.textViewName2.setText(superHero.getName());
    //holder.textViewRank.setText(String.valueOf(superHero.getRank()));
    //holder.textViewRealName.setText(superHero.getRealName());
    //holder.textViewCreatedBy.setText(superHero.getCreatedBy());
    //holder.textViewFirstAppearance.setText(superHero.getFirstAppearance());

    String powers = "";

   /* for(int i = 0; i<superHero.getPowers().size(); i++){
        powers+= superHero.getPowers().get(i);
    }*/

    //holder.textViewPowers.setText(powers);

    holder.imageView1.setOnClickListener(new View.OnClickListener() {
        public Activity context;
        @Override
        public void onClick(View v) {
            BehindTheLayoutFragment nextFrag= new BehindTheLayoutFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.behind_the_layout_fragment, nextFrag)
                    .addToBackStack(null)
                    .commit();


        }
    });

}


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

class ViewHolder extends RecyclerView.ViewHolder {
    public NetworkImageView imageView1;
    public TextView textViewName1;
    public TextView textViewName2;
    public TextView textViewRank;
    public TextView textViewRealName;
    public TextView textViewCreatedBy;
    public TextView textViewFirstAppearance;
    public TextView textViewPowers;

    public ViewHolder(View itemView) {
        super(itemView);
        imageView1 = (NetworkImageView) itemView.findViewById(R.id.thumbnail);
        textViewName1 = (TextView) itemView.findViewById(R.id.category_title_one);
        /* textViewRank= (TextView) itemView.findViewById(R.id.textViewRank);
        textViewRealName= (TextView) itemView.findViewById(R.id.textViewRealName);
        textViewCreatedBy= (TextView) itemView.findViewById(R.id.textViewCreatedBy);
        textViewFirstAppearance= (TextView) itemView.findViewById(R.id.textViewFirstAppearance);
        textViewPowers= (TextView) itemView.findViewById(R.id.textViewPowers);
        */
    }
}

【问题讨论】:

  • 这个问题你解决了吗?你需要答案吗?

标签: android android-recyclerview


【解决方案1】:

getFragmentManager 必须在 activity 实例上调用,而不是在 RecyclerViewDataAdapter 上。

在你的 Activity 中使用这个类作为一个内部类,或者使用你在 RecyclerViewDataAdapter 的构造函数中传递的引用来获取片段管理器

【讨论】:

    【解决方案2】:
    public class RecyclerViewDataAdapter extends  RecyclerView.Adapter<RecyclerViewDataAdapter.ViewHolder>
    {
    
    recycleListener mListener;
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    holder.imageView1.setOnClickListener(new View.OnClickListener() {
        public Activity context;
        @Override
        public void onClick(View v) {
          mListener.onClick();
    
        }
    });
    
    
     public interface recycleListener
     {
      void onClick();
     }
    
    
    }
    
    
    
    
      public class MyActivity extends AppCompatActivity implements RecyclerViewDataAdapter.recycleListener
      {
    
      public void onClick()
      {
     BehindTheLayoutFragment nextFrag= new BehindTheLayoutFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.behind_the_layout_fragment, nextFrag)
                    .addToBackStack(null)
                    .commit();
    
      }
    
       }
    

    【讨论】:

    • 在 holder.imageView1.setOnClickListener(new View.OnClickListener() { public Activity context; @Override public void onClick(View v) { mListener.onClick(); 处获取空点异常; ---- ----> 显示 NullPointerException } });
    • 从 onClickListener 中删除“public Activity context;”行并检查
    • 首先我在“this.getFragmentManager().beginTransaction() .replace(R.id.behind_the_layout_fragment, nextFrag) .addToBackStack(null) .commit();”这一行遇到错误然后我将 getFragmentManager 更改为 getSupportFragmentManager 并且错误消失了,但我在 mListener 处收到错误空点
    【解决方案3】:

    注意事项!!

    1.) getFragment manager 在活动上下文中调用,而 getChildFragmentManager 在片段上下文中调用

    2.) 这指的是父类。在适配器类中 this 将引用适配器类,所以你不能这样做

    this.getFragmentManager().beginTransaction()
                    .replace(R.id.behind_the_layout_fragment, nextFrag)
                    .addToBackStack(null)
                    .commit();
    

    为什么?如第 1 点所述。 getFragmentManager 称为 onactivity 上下文。但是,您已经在适配器中传递了上下文。所以干脆做

    context.getFragmentManager().beginTransaction()
                        .replace(R.id.behind_the_layout_fragment, nextFrag)
                        .addToBackStack(null)
                        .commit();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多