2013-03-20 68 views
0

我有一個GridView包含一些圖像。我想通過點擊來改變圖像。我正在給出從DialogBox中選擇圖像的選項。但問題是,gridview沒有更新最新的圖像。我發現類似的問題How can I change Image on Gridview Runtime?。但即使解決方案不適合我的情況。我的代碼如下。如何更改GridVIew的圖像

private GridView gridView1,gridView2,gridView3; 
private View sepView1,sepView2; 
private static WallpaperInfo wall = new WallpaperInfo(); 

public Integer[] butterflyIds = { 
     R.drawable.create_cardz, 
     R.drawable.done_icon, 
     R.drawable.email, 
     R.drawable.facebook, 
     R.drawable.error_icon, 
     R.drawable.mms_lock, 
     R.drawable.ic_launcher, 
     R.drawable.icon_plus, 
     R.drawable.like, 

}; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    Log.i("BillingService", "Starting"); 
    setContentView(R.layout.wallpapersetting); 

    gridView1 = (GridView) findViewById(R.id.gridview1); 
    gridView2 = (GridView) findViewById(R.id.gridview2); 
    gridView3 = (GridView) findViewById(R.id.gridview3); 

    sepView1 = (View)findViewById(R.id.seperator1); 
    sepView2 = (View)findViewById(R.id.seperator2); 

    gridView1.setAdapter(new ImageAdapter(this, butterflyIds)); 
    final ImageAdapter im = new ImageAdapter(this,butterflyIds); 
    //gridView2.setAdapter(new ImageAdapter(this, butterflyIds)); 
    //gridView3.setAdapter(new ImageAdapter(this,background)); 


    gridView1.setOnItemClickListener(new OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> parentView, View vi, int position,long id) 
     { 
      createDialog(parentView,vi,position,butterflyIds,im,gridView1); 

     } 

    }); 


} 

private void createDialog(final AdapterView<?> parentView,View v,int pos,Integer[]  ID, final ImageAdapter im, final GridView gv) 
{ 
    final int parentPos= pos; 
    final Dialog dialog = new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.dialog_layout); 
    GridView dialogGridView = (GridView) dialog.findViewById(R.id.dialog_grid); 
    dialogGridView.setAdapter(new DialogImageAdapter(this,ID)); 
    dialogGridView.setOnItemClickListener(new OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> dialogParentView, View vi, int position,long id) 
     { 
      //parentView.addView(vi, position); 
      setImage(dialogParentView.getId(),parentPos,im); 
      dialog.dismiss(); 
      im.notifyDataSetChanged(); 
      gv.setAdapter(im); 
      gv.invalidateViews(); 

     } 

    }); 
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
    lp.copyFrom(getWindow().getAttributes()); 
    lp.width = WindowManager.LayoutParams.FILL_PARENT; 
    getWindow().setAttributes(lp); 
    dialog.show(); 
} 

protected void setImage(int viewId,int parentPos, ImageAdapter im) 
{ 
    im.setFlowerIds(parentPos, viewId); 
} 

我imageAdapter類是這個

package com.tdsoc.lw.utils; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 
private Integer[] mThumbIds; 
private ImageView imageView; 
// Keep all Images in array 

// Constructor 
public ImageAdapter(Context c) 
{ 
    mContext = c; 
} 

public ImageAdapter(Context c, Integer[] mTid) 
{ 
    mContext = c; 
    mThumbIds = mTid; 
} 
@Override 
public int getCount() 
{ 
    return mThumbIds.length; 
} 

@Override 
public Object getItem(int position) 
{ 
    return position; 
} 

@Override 
public long getItemId(int position) 
{ 
    return mThumbIds[position]; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    if(convertView == null) 
    { 
     imageView = new ImageView(mContext); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setLayoutParams(new GridView.LayoutParams(70, 70)); 
    } 
    else 
    { 
     imageView = (ImageView)convertView; 
    } 
    imageView.setImageResource(mThumbIds[position]); 
    //notifyDataSetChanged(); 
    return imageView; 
} 
public Integer[] getFlowerIds() 
{ 
    return mThumbIds; 
} 
public void setFlowerIds(int pos,int ID) 
{ 
    mThumbIds[pos]= ID; 
} 

} 
+0

爲什麼你在onCreate方法創建您的適配器的兩個實例?爲什麼不創建一個實例並將該實例設置爲gridview? – Neil 2013-03-20 06:42:26

回答

1

在您的適配器方法setFlowerIds添加方法notifyDataSetChanged();這可能會解決您的問題。

public void setFlowerIds(int pos,int ID) 
{ 
    mThumbIds[pos]= ID; 
    notifyDataSetChanged(); // add this method 
} 

編輯:我這是怎麼刷新我的BaseAdapter看看這對你的作品。還檢查了this問題

public synchronized void refresAdapter(List<Item> newItems) { 
    _items.clear(); //my adapter list 
    _items.addAll(newItems); 
    notifyDataSetChanged(); 
} 
+0

我曾試過..但它甚至不工作 – DkPathak 2013-03-20 06:46:55

+0

看到我編輯的答案 – Neil 2013-03-20 06:50:49

+0

這是什麼「_items」和「項目」。即時通訊沒有得到它爲我的情況.. – DkPathak 2013-03-20 07:06:26

0

你爲什麼要創建一個新的GridView每次有人點擊的項目..?

無論哪種方式,您都希望確保在適配器上調用notifyDataSetInvalidated()以強制重繪所有視圖。

+0

第二個gridview用於在dialogBox中顯示圖像。問題是點擊的圖像變得不可見,當我選擇從對話框的圖像更新 – DkPathak 2013-03-20 06:45:55