【问题标题】:how to accsses to getSupportFragmentManager from static method?如何从静态方法访问 getSupportFragmentManager?
【发布时间】:2017-11-11 11:50:15
【问题描述】:

我正在使用 RecyclerView 来显示数据。在回收站视图中,我有 onClick 方法,我想在片段之间替换。我唯一的问题是我无法从静态方法访问 getSupportFragmentManager 或 getChildFragmentManager。 RecyclerView 位于片段内部,而不是活动。

这是 RecyclerView 代码

 public static class TypeMusicListAdapter extends RecyclerView.Adapter<TypeMusicListViewHolder>{
    private LayoutInflater inflater;
    private Context context;
    private List<String> data;

    public TypeMusicListAdapter(Context context, List<String> data){
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public TypeMusicListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = inflater.inflate(R.layout.type_music_item,parent,false);
        return new TypeMusicListViewHolder(v);
    }

    @Override
    public void onBindViewHolder(TypeMusicListViewHolder holder, int position) {
        String songType = data.get(position);
        //holder.musicType.setText(songType.getSongName());
        holder.musicType.setText(songType);
    }

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

public static class TypeMusicListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView musicType;
    private FragmentManager fm;


    public TypeMusicListViewHolder(View itemView,FragmentManager fm) {
        super(itemView);
        musicType = (TextView) itemView.findViewById(R.id.musicType);
        this.fm = fm;
        musicType.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        getSupportFragmentManager().
                beginTransaction().
                replace(R.id.container, new GenresFragment()).
                commit();
    }
}

当然在 getSupportFragmentManager 中给我错误... 我该怎么办..?

【问题讨论】:

    标签: android android-recyclerview fragment


    【解决方案1】:

    更改您的视图持有者类,使其具有您的活动的成员变量。

    public static class TypeMusicListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView musicType;
        private FragmentManager fm;
    AppCompatActivity activity;
    
        public TypeMusicListViewHolder(View itemView,FragmentManager fm,AppCompatActivity act) {
            super(itemView);
            musicType = (TextView) itemView.findViewById(R.id.musicType);
            this.fm = fm;
    activity = act;
            musicType.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
    
            activity.getSupportFragmentManager().
                    beginTransaction().
                    replace(R.id.container, new GenresFragment()).
                    commit();
        }
    }
    

    【讨论】:

    • 当我将 AppCompatActivity 从 Recycler 带到外面时,我应该如何初始化它。顺便说一句,它在 Fragment 而不是 Activity。
    【解决方案2】:

    你应该使用回调接口。

    回调类

    public interface MyCallback{
    
      void onButtonClick();
    }
    

    适配器

     public static class TypeMusicListAdapter extends RecyclerView.Adapter<TypeMusicListViewHolder> implements View.OnClickListener{
    private LayoutInflater inflater;
    private Context context;
    private List<String> data;
    
    public TypeMusicListAdapter(Context context, List<String> data){
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.data = data;
    }
    
    @Override
    public TypeMusicListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = inflater.inflate(R.layout.type_music_item,parent,false);
        return new TypeMusicListViewHolder(v);
    }
    
    @Override
    public void onBindViewHolder(TypeMusicListViewHolder holder, int position) {
        String songType = data.get(position);
        //holder.musicType.setText(songType.getSongName());
        holder.musicType.setText(songType);
    
        holder.musicType.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View view) {
    
        ((YourActivity) context).onButtonClick();
    }
    
    @Override
    public int getItemCount() {
        return data.size();
    }
    }
    
       public static class TypeMusicListViewHolder extends RecyclerView.ViewHolder {
    private TextView musicType;
    private FragmentManager fm;
    
    
    public TypeMusicListViewHolder(View itemView,FragmentManager fm) {
        super(itemView);
        musicType = (TextView) itemView.findViewById(R.id.musicType);
        this.fm = fm;
    }
    
    
    }
    

    您的活动/片段

    (...)
    
    void onButtonClick(){
         getSupportFragmentManager().
                beginTransaction().
                replace(R.id.container, new GenresFragment()).
                commit();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2012-06-29
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多