Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找Glide Android的上下文_Java_Android_Performance_Android Glide - Fatal编程技术网

Java 查找Glide Android的上下文

Java 查找Glide Android的上下文,java,android,performance,android-glide,Java,Android,Performance,Android Glide,我正在尝试在网格视图中显示图片。此网格视图由适配器填充。 我总是有一个问题,那就是应用程序在为新卡充气时非常滞后。在网上搜索之后,我找到了Glide,这可能有助于提高性能 现在我被卡住了,因为我无法想象我应该在Glide中传递什么样的上下文 我使用MainActivity->Fragment->Adapter来构建卡 这是来自适配器的代码: public class SightCardAdapter extends RecyclerView.Adapter<SightCardAdapter

我正在尝试在网格视图中显示图片。此网格视图由适配器填充。 我总是有一个问题,那就是应用程序在为新卡充气时非常滞后。在网上搜索之后,我找到了Glide,这可能有助于提高性能

现在我被卡住了,因为我无法想象我应该在Glide中传递什么样的上下文

我使用MainActivity->Fragment->Adapter来构建卡

这是来自适配器的代码:

public class SightCardAdapter extends RecyclerView.Adapter<SightCardAdapter.SightViewHolder> {


public static class SightViewHolder extends RecyclerView.ViewHolder {
    CardView cv;
    TextView sightName;
    ImageView sightPhoto;

    SightViewHolder(View itemView) {
        super(itemView);
        cv = (CardView) itemView.findViewById(R.id.cv);
        sightName = (TextView) itemView.findViewById(R.id.sight_name);
        sightPhoto = (ImageView) itemView.findViewById(R.id.sight_photo);
    }
}

List<Sight> sights;

SightCardAdapter(List<Sight> sights) {
    this.sights = sights;
}


@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {

    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public SightViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    SightViewHolder pvh = new SightViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(SightViewHolder sightViewHolder, int i) {
    sightViewHolder.sightName.setText(sights.get(i).mName);
    //sightViewHolder.sightPhoto.setImageResource(sights.get(i).mImageRessourceID);
    Glide.with().load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); // missing context
}

@Override
public int getItemCount() {
    return sights.size();
}
public类SightCardAdapter扩展了RecyclerView.Adapter{
公共静态类SightViewHolder扩展了RecyclerView.ViewHolder{
卡德维尤简历;
TextView-sightName;
影像视窗;
可视查看文件夹(查看项目视图){
超级(项目视图);
cv=(cardwiew)itemView.findviewbyd(R.id.cv);
sightName=(TextView)itemView.findViewById(R.id.sight\u name);
sightPhoto=(ImageView)itemView.findviewbyd(R.id.sight\u photo);
}
}
列出景点;
瞄准具适配器(列表瞄准具){
这个。景点=景点;
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
@凌驾
public SightViewHolder onCreateViewHolder(视图组视图组,int i){
视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.item,viewGroup,false);
视窗支架pvh=新视窗支架(v);
返回pvh;
}
@凌驾
BindViewHolder上的公共无效(SightViewHolder SightViewHolder,int i){
sightViewHolder.sightName.setText(sights.get(i.mName));
//sightViewHolder.sightPhoto.setImageResource(sights.get(i.mimagerSourceId));
Glide.with().load(sights.get(i).mimagersourceid).into(sightViewHolder.sightPhoto);//缺少上下文
}
@凌驾
public int getItemCount(){
返回sights.size();
}
}

谁能给我一些提示吗?我无法想象我应该传递什么


PS:另外,如果有人知道如何使我的代码更高效,我将非常感激:)

在向适配器传递数据的同时也传递参数上下文。如果您是从MainActivity的子片段调用适配器,只需将getApplicationContext()作为上下文传递给适配器

SightCardAdapter(Context context,List<Sight> sights) {
     this.sights = sights;
     this.context=context;
}

while calling from Fragment.
SightCardAdapter(getApplicationContext(),sights);
SightCardAdapter(上下文,列表视景){
这个。景点=景点;
this.context=context;
}
从片段调用时。
SightCardAdapter(getApplicationContext(),sights);

您可以从任何对象获取
上下文


为适配器创建对象时传递上下文。更改了下面的代码

public class SightCardAdapter extends RecyclerView.Adapter<SightCardAdapter.SightViewHolder> {


public static class SightViewHolder extends RecyclerView.ViewHolder {
    CardView cv;
    TextView sightName;
    ImageView sightPhoto;


    SightViewHolder(View itemView) {
        super(itemView);
        cv = (CardView) itemView.findViewById(R.id.cv);
        sightName = (TextView) itemView.findViewById(R.id.sight_name);
        sightPhoto = (ImageView) itemView.findViewById(R.id.sight_photo);

    }
}
Context context;
List<Sight> sights;

SightCardAdapter(List<Sight> sights,Context context) {
    this.sights = sights;
    this.context = context;
}


@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {

    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public SightViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    SightViewHolder pvh = new SightViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(SightViewHolder sightViewHolder, int i) {
    sightViewHolder.sightName.setText(sights.get(i).mName);
    //sightViewHolder.sightPhoto.setImageResource(sights.get(i).mImageRessourceID);
    Glide.with(context).load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); // missing context
}

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

}
public类SightCardAdapter扩展了RecyclerView.Adapter{
公共静态类SightViewHolder扩展了RecyclerView.ViewHolder{
卡德维尤简历;
TextView-sightName;
影像视窗;
可视查看文件夹(查看项目视图){
超级(项目视图);
cv=(cardwiew)itemView.findviewbyd(R.id.cv);
sightName=(TextView)itemView.findViewById(R.id.sight\u name);
sightPhoto=(ImageView)itemView.findviewbyd(R.id.sight\u photo);
}
}
语境;
列出景点;
SightCardAdapter(列出场景、上下文){
这个。景点=景点;
this.context=上下文;
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
@凌驾
public SightViewHolder onCreateViewHolder(视图组视图组,int i){
视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.item,viewGroup,false);
视窗支架pvh=新视窗支架(v);
返回pvh;
}
@凌驾
BindViewHolder上的公共无效(SightViewHolder SightViewHolder,int i){
sightViewHolder.sightName.setText(sights.get(i.mName));
//sightViewHolder.sightPhoto.setImageResource(sights.get(i.mimagerSourceId));
Glide.with(context).load(sights.get(i).mimagersourceid).into(sightViewHolder.sightPhoto);//缺少上下文
}
@凌驾
public int getItemCount(){
返回sights.size();
}
}

像这样在适配器中传递上下文

Private Context mContext;
SightCardAdapter(List<Sight> sights,Context mContext) {
    this.sights = sights;
    this.mContext = mContext;
}

Glide.with(mContext).load("url").into(imageView);
私有上下文mContext;
SightCardAdapter(列出景点、上下文mContext){
这个。景点=景点;
this.mContext=mContext;
}
使用(mContext)将(“url”)加载到(imageView)中;
试试看

在创建适配器对象时从活动传递上下文,或从itemView获取上下文

Context context = itemView.getContext();
Pass this context to Glide.
为了有效地使用

private RequestManager glideManager;  

public MyAdater(Context context, Object activityOrFragment){
     if (object instanceof Fragment) {
         glideManager = Glide.with((Fragment) object);
     } else if (object instanceof Activity) {
         glideManager = Glide.with((Activity) object);
     }
}


@Override
public void onBindViewHolder(ViewHolderGeneric viewHolder, int position) {
   glideManager
         .load(item.getResizedImageUrl())
         .placeholder(R.drawable.emptystates_card_bg_none)
         .fitCenter()
         .into(ivGoods);
}

适配器

MyRecyclerAdapter adapter = new MyRecyclerAdapter(mContext, this);  //this -> Activity or Fragment

将上下文传递给adapter-SightViewHolder(View itemView,context context)的方式与传递给
LayoutInflater.from
的方式相同。。。提示:您使用的是哪个类的哪个方法?将上下文作为参数传递请参考Sataym的答案没有必要将上下文传递给SightViewHolder…我已经尝试过这个解决方案。看起来像:Glide.with(getApplicationContext()).load(sights.get(i.mimagersourceid).into(sightViewHolder.sightPhoto);但Android Studio表示无法解析方法:SGlide.with(getApplicationContext())您不能在适配器内使用getApplicationContext()。从片段将此上下文发送到适配器。
Private Context mContext;
SightCardAdapter(List<Sight> sights,Context mContext) {
    this.sights = sights;
    this.mContext = mContext;
}

Glide.with(mContext).load("url").into(imageView);
Context context = itemView.getContext();
Pass this context to Glide.
private RequestManager glideManager;  

public MyAdater(Context context, Object activityOrFragment){
     if (object instanceof Fragment) {
         glideManager = Glide.with((Fragment) object);
     } else if (object instanceof Activity) {
         glideManager = Glide.with((Activity) object);
     }
}


@Override
public void onBindViewHolder(ViewHolderGeneric viewHolder, int position) {
   glideManager
         .load(item.getResizedImageUrl())
         .placeholder(R.drawable.emptystates_card_bg_none)
         .fitCenter()
         .into(ivGoods);
}
MyRecyclerAdapter adapter = new MyRecyclerAdapter(mContext, this);  //this -> Activity or Fragment