【问题标题】:Create a grid of imageviews dynamically动态创建图像视图网格
【发布时间】:2013-12-27 11:33:38
【问题描述】:

好的,所以我正处于偏头痛点,感觉无论我尝试做什么,我都在违背常规。

如何获得图像视图的网格视图(使用下面的数组适配器从位图中覆盖)以在动态数量的列和行中并排显示,它们之间没有间距?

public class GameAdapter extends BaseAdapter {

//Variable setup
private Context context;
private Bitmap[] values;

//Construct the image parameter, get context, the array of images, and the height/width of them
public GameAdapter(Context context, Bitmap[] _values) {
    this.context = context;
    this.values = _values;
}

//Convert Dp to pixels for modularity
private int dpToPx(int dp)
{
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round((float)dp * density);
}

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

@Override
public Object getItem(int i) {
    return values[i];
}

@Override
public long getItemId(int i) {
    return values[i].getGenerationId();
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    ImageView imageView = new ImageView(context);
    imageView.setImageBitmap(values[i]);
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
  //  int pad = dpToPx(1);
//    imageView.setPadding(pad,pad,pad,pad);
//      Log.w("Derp", "" + "Height- "+values[i].getHeight());
//    Log.w("Derp", "" + "Width- "+values[i].getWidth());
    imageView.setLayoutParams(new GridView.LayoutParams(values[i].getWidth(), values[i].getHeight()));
    return imageView;
}


}

【问题讨论】:

  • 您是否要求将每行和每列的垂直和水平间距设置为空?还是多个不同宽度的 ImageView 的宽度问题?
  • 它们的宽度/高度相同,但直到运行时我才知道它是什么,所以最初需要将它们设置为 null 或任何其他要被覆盖的值。

标签: android gridview imageview baseadapter


【解决方案1】:

要在运行时获得最佳性能,您应该执行以下小技巧:创建一个 AsyncTask 来加载您的 ImageView 并将它们设置为 null。

final ImageView imageView = (ImageView)   
view.findViewById(R.id.image);  

// Set the ImageView to null
imageView.setImageBitmap(null);  

new AsyncTack<String, Void, Bitmap>() {

    protected Bitmap doInBackground(String... params) {  
        String url = params[0];  
        Bitmap bitmap = downloadBitmap(url);  
        return bitmap;  
    } 

    // Set the ImageView with the Bitmap downloaded
    protected void onPostExecute(Bitmap bitmap) {  
        imageView.setImageBitmap(bitmap);  
    }. 

}.execute(url);  

要动态创建GridView,您应该阅读这个SO问题:
Android dynamic GridView

GridView grid = new GridView(this);  
grid.setId(215236);  
grid.setLayoutParams(new GridView.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));  
grid.setBackgroundColor(Color.WHITE);  
grid.setColumnWidth(GridView.AUTO_FIT);  
grid.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);    

如果你想动态去除每行和每列的间距(垂直和水平),你应该尝试:

gridview.setVerticalSpacing(0);  
gridview.setHorizontalSpacing(0);  

要使行/列的宽度/高度与ImageView 的宽度/高度一致,您可以将GridView 放入LinearLayout(将其设置为 MATCH_PARENT)并将此布局的 getMeasured 设置为知道其中包含多少ImageViews
查看这些答案以获取有关此技巧的更多信息:
Android: How does GridView auto_fit find the number of columns?

希望这就是你要找的。​​p>

【讨论】:

    【解决方案2】:

    gridview 图像请参考以下内容:

    grid_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/grid_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="auto_fit"
        android:columnWidth="90dp"
        android:horizontalSpacing="10dp"
        android:verticalSpacing="10dp"
        android:gravity="center"
        android:stretchMode="columnWidth" >  
    
    </GridView>
    

    ImageAdapter.java

    package com.imagesample;
    
    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;
    
         // all Images in array
             public Integer[] mThumbIds = {
                 R.drawable.p1, R.drawable.p2,
                 R.drawable.p3, R.drawable.p4,
                 R.drawable.p5, R.drawable.p6,
                 R.drawable.p7, R.drawable.p8,
                 R.drawable.p9, R.drawable.p10,
                 R.drawable.p11, R.drawable.p12,
                R.drawable.p13, R.drawable.p14,
                 R.drawable.p15
         };
    
         // Constructor
         public ImageAdapter(Context c){
             mContext = c;
         }
    
         @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(70, 70));
             return imageView;
         }   }
    

    GridActivity.java

    package com.imagesample;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.GridView;
    
    public class GridActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.grid_layout);
    
            GridView gridView = (GridView) findViewById(R.id.grid_view);
    
            // Instance of ImageAdapter Class
            gridView.setAdapter(new ImageAdapter(this));
        }
    }
    

    希望对你有很大帮助。

    【讨论】:

    • 这种只有链接的回答是不能接受的。是的,当您在此处包含文章的重要部分时可以。不计入答案的原因是该文章/链接将来可能不再存在。
    • 稍作修改以添加动态感觉并在滚动更改时加载您的代码是最好的.....非常感谢。