2014-01-13 4 views
3

Я использую следующий код для отображения элементов GirdView.Отличное линейное расстояние между элементами сетки.

<GridView 
      android:id="@+id/gridView" 
      android:gravity="center_horizontal" 
      android:layout_below="@+id/searchLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:horizontalSpacing="10dp" 
      android:numColumns="3" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="10dp" /> 

Каждый GridItem (ImageView) имеет размер 92dp

Что я хочу, чтобы показать только 3 столбцов или 3 изображения каждой строки и каждый верхний, нижний, левый правый все должно быть идеально выровнены и равное ,

Ниже приведено вышеописанный код.

enter image description here

Можно видеть, что пространства слева и справа от сетки очень меньше по сравнению с теми, в между изображениями, а также между рядами очень малы.

Во-вторых, я использую 92dp. выше - результат S3, но когда я использую небольшой экран, третье изображение не подходит, как на 320-дюймовом экране.

Не следует использовать «dp» автоматически настроить в соответствии с размером экрана?

+0

попробуйте с моим ответом? Сообщите мне, не решила ли ваша проблема. –

ответ

0

Я думаю, что этот код поможет вам попробовать: -

GridView 
android:id="@+id/grid_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:numColumns="3" 
android:gravity="center" 
android:stretchMode="columnWidth" 
android:background="#000000"/> 
0

В XML из GridView

<GridView 
     android:id    = "@+id/gridViewSms" 
     android:layout_width  = "fill_parent" 
     android:layout_height  = "fill_parent" 
     android:numColumns  = "3" 
     android:horizontalSpacing = "10dp" 
     android:verticalSpacing = "10dp" 
     android:gravity   = "center" 
     android:stretchMode  ="columnWidth"> 

В ImageAdapter.java

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 int widthOfScrren; 
    public Integer[] mThumbIds; 


     // Constructor 
     public ImageAdapter(Context c,int ScrrenSize,Integer[] mThumbIds){ 
      mContext = c; 
      widthOfScrren=ScrrenSize; 
      this.mThumbIds = mThumbIds; 
     } 

     @Override 
     public int getCount() { 
      return mThumbIds.length; 
     } 

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

     @Override 
     public long getItemId(int position) { 
      return 0; 
     } 


     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imageView = new ImageView(mContext); 
      imageView.setImageResource(mThumbIds[position]); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 

      imageView.setLayoutParams(new GridView.LayoutParams(widthOfScrren/4,widthOfScrren/4)); 
      return imageView; 
     } 



} 

В Вашей деятельности

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.Display; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 

public class MainActivity extends Activity{ 


    private Integer[] mThumbIds = { 
      R.drawable.image1 , 
      R.drawable.image2, 
      R.drawable.image3, 
      R.drawable.image4, 
      R.drawable.image5, 
      R.drawable.image6, 
      R.drawable.image7, 
      R.drawable.image8, 
      R.drawable.image9 
    }; 


    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 



     //found width of Screen for Gridview 
     WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     int densityX = display.getWidth(); 



     GridView grid = (GridView) findViewById(R.id.gridViewSms); 
     grid.setAdapter(new ImageAdapter(getApplicationContext(), densityX, mThumbIds)); 

     grid.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position , 
        long id) { 


      } 
     }); 


    } 

} 

Я протестировал его. Оно работает.

0

В прошлом я использовал GridLayout вместо GridView, чтобы сохранить совместимость с api v8.

для GridLayout, я написал небольшую функцию, которая помещается в действие, чтобы динамически растягивать/перемещать элементы в сетке, чтобы равномерно заполнить представление. Я писал об этом здесь:

https://stackoverflow.com/a/15341447/2066079

Я также скопировал код, приведенный ниже, для вашего удобства:.

public void fillview(android.support.v7.widget.GridLayout gl) 
{ 
    Button buttontemp; 

    //Stretch buttons 
    int idealChildWidth = (int) ((gl.getWidth()-20*gl.getColumnCount())/gl.getColumnCount()); 
    for(int i=0; i< gl.getChildCount();i++) 
    { 
     buttontemp = (Button) gl.getChildAt(i); 
     buttontemp.setWidth(idealChildWidth); 
    } 
} 

(20-для внутренней и внешней прокладки и полей Это может быть сделать более универсально, но это намного чище)

Тогда это можно назвать так:

android.support.v7.widget.GridLayout gl = (android.support.v7.widget.GridLayout)findViewById(R.id.buttongrid); 
    ViewTreeObserver vto = gl.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Override public void onGlobalLayout() 
    { 

      android.support.v7.widget.GridLayout gl = (android.support.v7.widget.GridLayout) findViewById(R.id.buttongrid); 
      fillview(gl); 

      ViewTreeObserver obs = gl.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
    }}); 

Это должно быть сделано с наблюдателем, потому что нам нужно дождаться, пока изображение будет нарисовано, прежде чем мы вызовет представления.

0

Пожалуйста, воспользуйтесь этим кодом:

Сетка.XML:

<GridView 
     android:id="@+id/photo_grid" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="10dp" 
     android:numColumns="3" /> 

Пользовательский XML-файл для фото:

<ImageView 
     android:id="@+id/img_photo" 
     android:layout_width="@dimen/grid_photo" 
     android:layout_height="@dimen/grid_photo" 
     android:scaleType="fitXY" 
     android:layout_margin="5dp" 
     android:src="@drawable/ic_launcher" /> 

ПРИМЕЧАНИЕ: Здесь я рекомендую использовать другое измерение для размера изображений вместо фиксированного 92dp. Таким образом, используя dimens.xml, вы можете получить точную ширину и высоту для разного разрешения и с одинаковым пространством со всех сторон в Gridview.

0

Я прошел через ту же самую проблему давно & получить решаемой это:

Вы можете сделать некоторые изменения атрибутов, как показано ниже в Gridview:

<GridView 
     android:id="@+id/gridView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/rltop" 
     android:fadingEdge="none" 
     android:fitsSystemWindows="true" 
     android:gravity="center" 
     android:horizontalSpacing="10dp" 
     android:numColumns="3" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:soundEffectsEnabled="true" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="10dp" > 
    </GridView> 

Получить ваш размер экрана & Ширина:

Display display= ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     myapp.screen_width = display.getWidth(); 
     myapp.screen_height = display.getHeight(); 

И самое главное:

В классе GridAdapter -> в GetView() метод:

вызов ниже метод целевых устройств с различным разрешением:

public void screenResolutions(int screen_width,int screen_height, RelativeLayout relativeLayout) 
     { 
      if((myapp.screen_width == 240)&&(myapp.screen_height==320)) 
      { 
    //   relativeLayout.getLayoutParams().height=(myapp.screen_height-(35+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 
      } 
      else if((myapp.screen_width== 720)&&(myapp.screen_height==1280)) 
      { 
     //  relativeLayout.getLayoutParams().height=(myapp.screen_height-(107+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
      else if((myapp.screen_width== 320)&&(myapp.screen_height==480)) 
      { 
    //   relativeLayout.getLayoutParams().height=(myapp.screen_height-(47+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
      else if((myapp.screen_width == 480)&&(myapp.screen_height==800)) 
      { 
//    relativeLayout.getLayoutParams().height=(myapp.screen_height-(71+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
      else if((myapp.screen_width == 768)||(myapp.screen_height==1280)) 
      { 
    //   relativeLayout.getLayoutParams().height=(myapp.screen_height-(114+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
      else if((myapp.screen_width == 540)&&(myapp.screen_height==960)) 
      { 
    //   relativeLayout.getLayoutParams().height=(myapp.screen_height-(80+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
      else if((myapp.screen_width == 1080)||(myapp.screen_height==1920)) 
      { 
    //   relativeLayout.getLayoutParams().height=(myapp.screen_height-(160+General.getStatusBarHeight(cntxt)))/3; 
       relativeLayout.getLayoutParams().width=(myapp.screen_width)/3; 


      } 
     } 

Где relativelayout = макет, который состоит из ImageView.

Вы также должны изменить высоту & ширину ImageView целевой несколько резолюций, как показано ниже:

это в вашем ImageView:

android:layout_width="@dimen/image_width" 
    android:layout_height="@dimen/image_height" 

Put это:

В значениях значений папок-hdpi => dimens.xml (480x800)

<dimen name="image_width">92dp</dimen> 
<dimen name="image_height">92dp</dimen> 

В папке значений величин-MDPI => dimens.xml (320x480)

<dimen name="image_width">64dp</dimen> 
<dimen name="image_height">64dp</dimen> 

В папке значений значения-sw360dp-notlong-ИПЧР => dimens.xml (540x960)

<dimen name="image_width">114dp</dimen> 
<dimen name="image_height">114dp</dimen> 

В папке значений значения-sw360dp-xhdpi => dimens.xml (720x1280)

<dimen name="image_width">138dp</dimen> 
<dimen name="image_height">138dp</dimen> 

В значениях значений папок - sw360dp-notlong-xhdpi => dimens.XML (768x1280)

<dimen name="image_width">184dp</dimen> 
<dimen name="image_height">184dp</dimen> 
+0

Это работало для вас? –

+0

@Sager Я не уверен, почему вы используете screenResolutions(), когда все размеры изменяются как dimens.xml во-вторых, если я использую код выше, я могу дать равные пространства по горизонтали, но вертикально их пробелы не равны –

+0

@MuhammadUmar Что делает screenResolutions(): Если вы используете разрешения с разрешением 480x800, тогда только 3 изображения будут восстанавливать всю вашу ширину устройства, т. Е. Полностью ими 480. Это означает, что ширина вашего устройства является совершенной, разделенной на 3 части. –

0

Вы попробуйте по умолчанию демо дается Developer site?

Этот демонстрационный отчет показывает все изображения с одинаковой высотой и шириной и с равным пространством вокруг него.

Также проверьте это Example for GridView.

Пожалуйста, дайте мне знать, если это не поможет вам.

Наслаждайтесь кодированием ... :)

Смежные вопросы