【问题标题】:Changing gridVIew's imageView outside of the adapter在适配器之外更改 gridVIew 的 imageView
【发布时间】:2012-12-21 14:23:00
【问题描述】:

我该怎么做?这是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);
        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;
}

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

这是一个将适配器附加到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 类: 公共无效下载缩略图(){

    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);
}

【问题讨论】:

  • 你在哪里调用changeView()方法?
  • 您能否请教您想要实现的目标,此外您还没有在您发布的代码中将适配器设置为 gridView。
  • 我有一个带有gridView的片段,这个适配器是附加到gridView的。
  • 你的代码有问题,什么是图像类?你的适配器是什么关系?你正在创建空的 gridview 并试图在特定位置获取项目吗?
  • 罗马人,请提供更多关于您的全球目标的信息。我相信您解决问题的方法有误,但我只能确定您是否进一步描述它。

标签: android gridview adapter


【解决方案1】:

在您的适配器中创建一个集合来保存您需要应用的图像。当您需要更改特定getView行的图像时,在相应集合中更改图像:

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
}

此外,如果您不愿意将冗余位图放入集合中,只是为了将它们作为默认值加载,您可以在 getView 中使用它来管理:

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

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

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

【讨论】:

  • 谢谢!较早使用它的方法,但认为这不是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多