在适配器外部更改gridVIew的imageView [英] Changing gridVIew's imageView outside of the adapter

查看:129
本文介绍了在适配器外部更改gridVIew的imageView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我该怎么做?这是GridView适配器中的方法

  public static void changeView(Bitmap bmp,int pos){


GridView gridView = new GridView(mContext);

ImageView view =(ImageView)gridView.getChildAt(pos);
if(view == null)
Log.e(ImageAdapter Error,ImageView is null);
}

这是一个getView方法

  @Override 
public View getView(int position,View convertView,ViewGroup parent){

ImageView imageView;
if(convertView == null){
// imageView = Inflater.inflate(R.layout.image_layout,null);
imageView = new ImageView(mContext); (DefinedValues.width / 3 imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height / 4,DefinedValues.height / 4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width / 3-5,DefinedValues.width / 3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8,8,8,8);
} else {
imageView =(ImageView)convertView;
}
imageView.setImageResource(R.drawable.test3);

return imageView;
}

imageView每次都是空的。可以在静态类中设置Context对象mContext吗?



这是一个将适配器连接到gridView的片段类

  public class fragment1 extends Fragment {
$ b $ * /(非Javadoc)
* @see android.support.v4.app.Fragment# onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)
* /
GridView gridView;

@Override
public查看onCreateView(LayoutInflater inflater,ViewGroup容器,
//
Bundled savedInstanceState){




if(container == null){
Log.e(Null container,Null);
返回null;
}
Log.e(fragment1,fragment1 reached!);
View view = inflater.inflate(R.layout.menu1_fragment,container,false);
gridView =(GridView)view.findViewById(R.id.gridview1);

gridView.setAdapter(new ImageAdapter(this.getActivity()));


gridView.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent,View v,int position,long id){
ImageView imageView = new ImageView(getActivity());
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams
(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(vp);

imageView.setImageBitmap(DefinedValues.imageContainer.get(position).getThumbnail());
getActivity()。addContentView(imageView,vp);
}


});



返回gridView;




$ b MyImage类
public void downloadThumbnail( ){

  DefinedValues.thumbnail.put(activity,DefinedValues.images); 
DefinedValues.thumbnail.put(type,thumbnail);
DefinedValues.thumbnail.put(name,this.name);
DefinedValues.thumbnail.put(width,DefinedValues.width +);

//创建请求到服务器
String req = Json.stringToJson(DefinedValues.thumbnail);
Log.d(TAG,downloadImage()called。Request to server:+ req);
DefinedValues.thumbnail.clear();
thumb = new ImageDownloader();
thumb.setListener(MyImage.this);
thumb.execute(req);


Log.d(TAG,下载缩略图编号+ imageCount);



$ public void returnImage(Bitmap res){
Log.d(TAG,设置缩略图...);
this.setThumbnail(res);


解决方案

保存您需要应用的图像。当您需要更改特定 getView 行的图片时,请更改相应集合中的图片:

 私人位图[] imgCollection; 

@Override
public View getView(int position,View convertView,ViewGroup parent){

ImageView imageView;
if(convertView == null){
// imageView = Inflater.inflate(R.layout.image_layout,null);
imageView = new ImageView(mContext); (DefinedValues.width / 3 imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height / 4,DefinedValues.height / 4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width / 3-5,DefinedValues.width / 3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8,8,8,8);
} else {
imageView =(ImageView)convertView;
}
imageView.setImageBitmap(imgCollection [position]); //< - 已更改
返回imageView;
}


public void changeImageBitmap(Bitmap bmp,int pos){
imgCollection [pos] = bmp;
notifyDataSetChanged();此外,如果您不想放置冗余位图,则可以使用listview
}

在一个集合中,只需将它们加载为默认值,您就可以在 getView 中管理它,而不是:

  if(imgCollection [position] == null){
imageView.setImageResource(R.drawable.test3);
} else {
imageView.setImageBitmap(imgCollection [position]); //< - changed
}






< blockquote>

可以在类static中设置Context对象mContext吗?


绝对没有。应该永远不需要这样做。如果上下文是静态的,它可能会阻止您的活动或其中的任何内容被垃圾收集。您的应用程序最终可能会因缺乏资源而崩溃。


How can I do it? This is the method in GridView adapter

     public static void changeView(Bitmap bmp, int pos){


   GridView gridView = new GridView(mContext);

    ImageView view = (ImageView) gridView.getChildAt(pos);
    if (view == null)
    Log.e("ImageAdapter Error", "ImageView is null");
    }

This is a getView method

    @Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;
    if (convertView == null) {  
    //  imageView = Inflater.inflate(R.layout.image_layout, null);
        imageView = new ImageView(mContext);
        if (DefinedValues.width/3 < DefinedValues.height/4)
        imageView.setLayoutParams(new GridView.LayoutParams
                (DefinedValues.height/4, DefinedValues.height/4));
        else
            imageView.setLayoutParams(new GridView.LayoutParams
                    (DefinedValues.width/3-5, DefinedValues.width/3-5));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    } else {
        imageView = (ImageView) convertView;
    }
    imageView.setImageResource(R.drawable.test3);

    return imageView;
}

The imageView is null everytime. And is it ok to set Context object mContext in class static?

This is a fragment class that attaches adapter to gridView

     public class fragment1 extends Fragment {

/* (non-Javadoc)
 * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
 */
GridView gridView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        //
        Bundle savedInstanceState) {




    if (container == null) {
        Log.e("Null container", "Null");
        return null;
    }
    Log.e("fragment1", "fragment1 reached!");
    View view =  inflater.inflate(R.layout.menu1_fragment, container, false);
    gridView = (GridView)view.findViewById(R.id.gridview1);

    gridView.setAdapter(new ImageAdapter(this.getActivity()));


    gridView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            ImageView imageView = new ImageView(getActivity());
            LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams
                    (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            imageView.setLayoutParams(vp);

            imageView.setImageBitmap(DefinedValues.imageContainer.get(position).getThumbnail());
            getActivity().addContentView(imageView, vp);
        }


    });



    return gridView;
}
    }

MyImage class: public void downloadThumbnail(){

    DefinedValues.thumbnail.put("activity", DefinedValues.images);
    DefinedValues.thumbnail.put("type", "thumbnail");
    DefinedValues.thumbnail.put("name", this.name);
    DefinedValues.thumbnail.put("width", DefinedValues.width + "");

    //Creates request to server
    String req = Json.stringToJson(DefinedValues.thumbnail);
    Log.d(TAG, "downloadImage() called. Request to server: " + req);
    DefinedValues.thumbnail.clear();
    thumb = new ImageDownloader();
    thumb.setListener(MyImage.this);
    thumb.execute(req);


    Log.d(TAG, "downloaded thumbnail nr." + imageCount);

}


public void returnImage(Bitmap res) {
    Log.d(TAG, "Setting up thumbnail...");
    this.setThumbnail(res);
}

解决方案

make a collection in your adapter to hold the images that you need applied. When you need to change the image of a specific getView row, change in the image in the corresponding collection:

private Bitmap[] imgCollection;

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;
    if (convertView == null) {  
        //  imageView = Inflater.inflate(R.layout.image_layout, null);
        imageView = new ImageView(mContext);
        if (DefinedValues.width/3 < DefinedValues.height/4)
            imageView.setLayoutParams(new GridView.LayoutParams
                    (DefinedValues.height/4, DefinedValues.height/4));
        else
            imageView.setLayoutParams(new GridView.LayoutParams
                    (DefinedValues.width/3-5, DefinedValues.width/3-5));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    } else {
        imageView = (ImageView) convertView;
    }
    imageView.setImageBitmap(imgCollection[position]); // <-- changed 
    return imageView;
}


public void changeImageBitmap (Bitmap bmp, int pos) {
    imgCollection[pos] = bmp;
    notifyDataSetChanged(); // refresh the listview
}

moreover, if you're adverse to putting redundant bitmaps in a collection just to load them as a default value you could manage with this in getView instead:

    if (imgCollection[position] == null) {
        imageView.setImageResource(R.drawable.test3);
    } else {
        imageView.setImageBitmap(imgCollection[position]); // <-- changed           
    }


is it ok to set Context object mContext in class static?

No absolutely not. there should never be a need to do this. if the context is static, it could stop your activity or anything in it from being garbage collected. Your app might eventually crash from lack of resources.

这篇关于在适配器外部更改gridVIew的imageView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆