Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to refresh a GridView?

I have a GridView which is pretty similar to the Google tutorial, except that I want to add the ImageViews on runtime (via a subactivity). The results are okay, but the layout of the View is messed up: The GridView doesn't fill the content of its parent, what do I have to do to design it properly?

Here the code of adding the children:

public void initializeWorkbench(GridView gv, Vector<String> items) {         Prototype.workbench.setDimension(screenWidth, divider.height()+workbenchArea.height());         Prototype.workbench.activateWorkbench();         // this measures the workbench correctly         Log.d(Prototype.TAG, "workbench width: "+Prototype.workbench.getMeasuredWidth());         // 320         Log.d(Prototype.TAG, "workbench height: "+Prototype.workbench.getMeasuredHeight());         // 30         ImageAdapter imgAdapter = new ImageAdapter(this.getContext(), items);         gv.setAdapter(imgAdapter);         gv.measure(screenWidth, screenHeight);         gv.requestLayout();         gv.forceLayout();         Log.d(Prototype.TAG, "gv width: "+gv.getMeasuredWidth());         // 22         Log.d(Prototype.TAG, "gv height: "+gv.getMeasuredHeight());         // 119         Prototype.workbench.setDimension(screenWidth, divider.height()+workbenchArea.height());     } } 

activateWorkbench, setDimension and measure in the workbench (LinearLayout above the GridView):

public void activateWorkbench() {     if(this.equals(Prototype.workbench)) {         this.setOrientation(VERTICAL);         show = true;         measure();     } }  public void setDimension(int w, int h) {     width = w;     height = h;     this.setLayoutParams(new LinearLayout.LayoutParams(width, height));     this.invalidate(); }  private void measure() {     if (this.getOrientation() == LinearLayout.VERTICAL) {         int h = 0;         int w = 0;         this.measureChildren(0, 0);         for (int i = 0; i < this.getChildCount(); i++) {             View v = this.getChildAt(i);             h += v.getMeasuredHeight();             w = (w < v.getMeasuredWidth()) ? v.getMeasuredWidth() : w;         }         if (this.equals(Prototype.tagarea))             height = (h < height) ? height : h;         if (this.equals(Prototype.tagarea))             width = (w < width) ? width : w;     }     this.setMeasuredDimension(width, height); } 

The ImageAdapter constructor:

public ImageAdapter(Context c, Vector<String> items) {     mContext = c;      boolean mExternalStorageAvailable = false;     boolean mExternalStorageWriteable = false;     String state = Environment.getExternalStorageState();      if (Environment.MEDIA_MOUNTED.equals(state)) {         // We can read and write the media         mExternalStorageAvailable = mExternalStorageWriteable = true;     } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {         // We can only read the media         mExternalStorageAvailable = true;         mExternalStorageWriteable = false;     } else {         // Something else is wrong. It may be one of many other states, but         // all we need         // to know is we can neither read nor write         mExternalStorageAvailable = mExternalStorageWriteable = false;     }      if (mExternalStorageAvailable && mExternalStorageWriteable) {         for (String item : items) {             File f = new File(item);             if (f.exists()) {                 try {                     FileInputStream fis = new FileInputStream(f);                     Bitmap b = BitmapFactory.decodeStream(fis);                     bitmaps.add(b);                     files.add(f);                 } catch (FileNotFoundException e) {                     Log.e(Prototype.TAG, "", e);                 }             }         }     } } 

And the xml layout:

<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"              android:layout_width="fill_parent"              android:layout_height="fill_parent"                 android:orientation="vertical"                 android:gravity="bottom"                  android:paddingLeft="0px"                 android:paddingTop="0px"                 android:paddingRight="0px">      <com.unimelb.pt3.ui.TransparentPanel             android:id="@+id/workbench"              android:layout_width="fill_parent"             android:layout_height="10px"             android:paddingTop="0px"             android:paddingLeft="0px"             android:paddingBottom="0px"             android:paddingRight="0px">          <GridView xmlns:android="http://schemas.android.com/apk/res/android"              android:id="@+id/gridview"             android:layout_width="fill_parent"              android:layout_height="fill_parent"             android:columnWidth="90dp"             android:numColumns="auto_fit"             android:verticalSpacing="10dp"             android:horizontalSpacing="10dp"             android:stretchMode="columnWidth"             android:gravity="center" />      </com.unimelb.pt3.ui.TransparentPanel>  </LinearLayout> 
like image 301
Daniel Avatar asked Dec 14 '10 10:12

Daniel


People also ask

How to refresh DataGridView in vb net after delete?

To refresh the grid after rows are added or deleted you need to set the DataSource property of the grid again and then invoke DataBind() method on the DataGridView object.

How do I center text in GridView?

Click on the gridView->properties->RowStyle:horizontal-align:Center // what ever you want.


1 Answers

the GridView has an invalidateViews() method.

when you call this method: "all the views to be rebuilt and redrawn." http://developer.android.com/reference/android/widget/GridView.html

i think this is what you need:)

like image 184
flyerz Avatar answered Sep 27 '22 19:09

flyerz