【问题标题】:Custom grid-view appearance for androidandroid的自定义网格视图外观
【发布时间】:2014-12-18 17:31:22
【问题描述】:

我有什么输出:


我想要实现的目标:(框是图像)


MainActivity.java

public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      GridView gridview = (GridView) findViewById(R.id.gridview);
      gridview.setAdapter(new ImageAdapter(this));
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
/>

ImageAdapter .java

public class ImageAdapter extends BaseAdapter {
   private Context mContext;

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

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

   public Object getItem(int position) {
      return null;
   }

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

   // create a new ImageView for each item referenced by the Adapter
   public View getView(int position, View convertView, ViewGroup parent) {
      ImageView imageView;
      if (convertView == null) {
      imageView = new ImageView(mContext);
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageView.setPadding(8, 8, 8, 8);
      } else {
      imageView = (ImageView) convertView;
      }

      imageView.setImageResource(mThumbIds[position]);
      return imageView;
   }

   // Keep all Images in array
   public Integer[] mThumbIds = {
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7
   };
}

【问题讨论】:

  • 你可能会找到你需要的答案[这里][1] [1]:stackoverflow.com/questions/22143569/…
  • @student 这根本不是一个好的答案,因为它不会回收视图,尽管对于少量项目它是可以的。
  • 我正在寻找可以使用视图支架进行回收的东西!

标签: java android android-gridview


【解决方案1】:

1) 创建ListView

2) 对于每一行,您都有不同的布局,因此您必须告诉列表视图以智能方式使用转换视图,因此请覆盖适配器的以下方法,例如 ArrayAdapter:

getViewTypeCount():这会询问您有多少种不同的行布局,显然 2 适合您的情况。

getItemViewType(int position):获取将由 getView 创建的 View 的类型,这意味着在 getView 中您将位置传递给getItemViewType(position),它会返回一个数字,例如,如果它是 2,则意味着您必须使用如果是 2 个,则连续 3 个图像使用其他布局。

其他步骤与普通列表视图相同。

【讨论】:

    【解决方案2】:

    使用默认网格视图无法实现。 一种方法是为 listView 使用自定义适配器。

    您的获取视图方法应类似于:

        public View getView(int position, View convertView, ViewGroup parent) 
        {
    
        View rowView = convertView;
        if (rowView == null)//set the convert view and the viewholder 
        {
        if (position%2==0)
        {//code to inflate a 2 item row
                    LayoutInflater inflater = _context.getLayoutInflater();
                    rowView = inflater.inflate(R.layout.2Item, parent,false);
                    ViewHolder viewHolder = new ViewHolder();
                    viewHolder._item1 = (ImageView) rowView.findViewById(R.id.2_item_1);
    
                    ViewHolder viewHolder = new ViewHolder();
                    viewHolder._item2 = (ImageView) rowView.findViewById(R.id.2_item_2)
                    rowView.setTag(viewHolder);
                }
    
                ViewHolder holder = (ViewHolder) rowView.getTag();
        holder.set();
        else
    
        {//code to inflate a 3 item row
                    LayoutInflater inflater = _context.getLayoutInflater();
                    rowView = inflater.inflate(R.layout.3Item, parent,false);
                    ViewHolder viewHolder = new ViewHolder();
                    viewHolder._item1 = (ImageView) rowView.findViewById(R.id.3_item_1);
    
                    ViewHolder viewHolder = new ViewHolder();
                    viewHolder._item2 = (ImageView) rowView.findViewById(R.id.3_item_2)
                    rowView.setTag(viewHolder);
        viewHolder._item3 = (ImageView) rowView.findViewById(R.id.3_item_3)
                    rowView.setTag(viewHolder);
                }
    
                ViewHolder holder = (ViewHolder) rowView.getTag();      
                holder.set();
           }
    return rowView;
        }
    

    可能有更好的方法来执行我提到的操作(我的 getView 代码可能不准确),所以请查看本教程:http://android.amberfog.com/?p=296

    最后一条评论 - 用于图像的数组列表也应相应更改,因此数组中的每个项目将包含 2 或 3 张图像

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多