无法解析recyclerView.adapter中的getActivity()

5 android transactions android-fragments

卡住了一点点.我尝试将getActivity更改为'c'(上下文),但getSupportFragmentManager获得相同的错误.阅读不同的主题,但找不到解决方案.检查过库并尝试更改它们但没有.非常感谢一些帮助!

 import android.app.Activity;
 import android.content.Context;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.app.DialogFragment;
 import android.support.v4.app.Fragment;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Toast;

 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.example.mrti.menu.Fragments.MealsListFragment;
 import com.example.mrti.menu.R;
 import java.util.ArrayList;


 public class CategoryAdapter extends RecyclerView.Adapter<ViewHolder> {

Context c;
ArrayList<Category> Categories;

public CategoryAdapter(Context c, ArrayList<Category> Categories) {
    this.c = c;
    this.Categories = Categories;
}
// INITIALIZE HOLDER
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rec_item, null);
    ViewHolder holder = new ViewHolder(v);
    return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {

    // BIND DATA TO VIEWS

    holder.mNameTextView.setText(Categories.get(position).getName());

    // LOAD IMAGES FROM WEB AND CACHE THEM

    Glide.with(c)
            .load(Categories.get(position).getImage())
            .diskCacheStrategy(DiskCacheStrategy.ALL) // Saves the media item after all transformations to cache and
                                                     // Saves just the original data to cache.
            .placeholder(R.mipmap.ic_launcher)
            .into(holder.img);

    // LISTENER

    holder.setItemClickListener(new itemClickListener() {
        @Override
        public void onItemClick(View v, int pos) {
            Toast.makeText(c, Categories.get(pos).getName(), Toast.LENGTH_SHORT ).show();

            MealsListFragment fragment = new MealsListFragment();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.root_layout, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();


        }
    });
   }
Run Code Online (Sandbox Code Playgroud)

Com*_*are 7

无法解析片段中的getActivity()

您的Java类声明如下:

public class CategoryAdapter extends RecyclerView.Adapter<ViewHolder>
Run Code Online (Sandbox Code Playgroud)

CategoryAdapter不是片段.CategoryAdapter是一个RecyclerView.Adapter.

RecyclerView.Adapter没有getActivity()方法.因此,您的代码将无法编译.

你似乎想在FragmentTransaction里面执行一个RecyclerView.Adapter.但是,为了能够打电话getSupportFragmentManager(),你需要FragmentActivity托管RecyclerViewCategoryAdapter所附带的东西.

但是,a RecyclerView.Adapter没有直接或间接的访问权限FragmentActivity.所以,你需要FragmentActivity进入CategoryAdapter.

您当前的构造函数声明为:

public CategoryAdapter(Context c, ArrayList<Category> Categories)
Run Code Online (Sandbox Code Playgroud)

我的猜测是,在你的活动中,你正在打电话new CategoryAdapter(this, someListOfcategories).如果是这样,请将构造函数更改为:

public CategoryAdapter(FragmentActivity c, ArrayList<Category> Categories)
Run Code Online (Sandbox Code Playgroud)

并改变你的领域是一个FragmentActivity.然后,您可以更改:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)

至:

FragmentManager fragmentManager = c.getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)

  • @AlexanderFarber:不,只要适配器具有与活动相同的生命周期。如果您执行某些操作导致适配器的寿命比其活动时间长(例如,将其粘贴在“静态”字段中),那么您将出现内存泄漏。 (2认同)