-2

我目前正在创建一个应用程序,我想将数据列表从数据库加载到其中,然后在 GridView 中显示该数据。我已经创建了与数据库的连接,并成功撤回并填充了 GridView。我遇到的问题是,在我的列表行布局中,我希望能够 setLayoutParams 以便可以裁剪图像并且所有图像都具有相同的尺寸,这样就不会在其他设备尺寸上造成问题。

我拥有的文件如下:

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="15dp"
    android:orientation="vertical">



    <ImageView
        android:id="@+id/list_image"
        android:layout_width="110dp"
        android:layout_height="110dp"
        android:src="@drawable/ic_launcher" />


</LinearLayout>

ListAdapter.java

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

public class DressesAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 

    public DressesAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_row, null);

        ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image
        //thumb_image.setLayoutParams(new ImageView.LayoutParams(70, 70));

        HashMap<String, String> dress = new HashMap<String, String>();
        dress = data.get(position);

        imageLoader.DisplayImage(dress.get(DressListActivity.TAG_IMAGE), thumb_image);
        return vi;
    }
}

ListActivity.java

<?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="5dp"
    android:verticalSpacing="5dp"
    android:gravity="center"
    android:stretchMode="columnWidth" >  

</GridView>

运行时我得到的错误如下:

04-06 14:02:18.260: E/AndroidRuntime(12798): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

我希望有人可以帮助我纠正这个问题,因为它真的很烦人,在此先感谢:)

4

2 回答 2

0

Exception是由import错误的LayoutParams子类引起的。也许最容易new LinearLayout.LayoutParams(明确地写出来。

不相关但也scaleType可能ImageView派上用场。

于 2013-04-06T13:08:03.127 回答
0

这是我用来显示包含 3 张图片的网格的方法,这些图片适合整个设备,每张图片的标题为 TextView。

它可以在所有设备上正确格式化。

我所有的照片都是纵横比为 1.5 的肖像,例如 300 像素高 x 200 像素宽。(这是您在大小调整功能中看到的 3.0 和 1.5,并根据需要进行更改)。

我为我的布局使用肖像。

希望你能让它工作,它很棘手。这对我来说非常有效。

设置您的 GridView 及其适配器,例如:

// create grid and adapter
gridAdapter = new SET UP YOUR ADAPTER HERE; 
    grid = (GridView) findViewById(R.id.grid);
    grid.setAdapter(YOUR ADAPTER);
    grid.setFadingEdgeLength(0);
    int picHeight = Utils.getGridPicHeight(MainActivity.this);
    int picLength = (int) ((float)picHeight / 1.5);
    grid.setColumnWidth(picLength);

还有 Utils.getGridPicHeight:

    public static int getGridPicHeight (Activity activity) { 
        DisplayMetrics dMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dMetrics);
        // give back a % of the screen width for the height
        final float WIDE = activity.getResources().getDisplayMetrics().widthPixels;
        int value = (int)(WIDE / 3.0f * 1.5f);
        return value;
}

非常重要的是,在您的适配器中,您必须像这样设置图像:

        LinearLayout.LayoutParams params;

        int picHeight = Utils.getGridPicHeight(activity);
        int picLength = (int) ((float)picHeight / 1.5);
        params = new LinearLayout.LayoutParams(picLength,picHeight);
        params.gravity=Gravity.CENTER;
        params.height=picHeight;
        params.width=picLength;
        image.setLayoutParams(params);

grid_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
    />
    <TextView 
        android:id="@+id/imgTit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:typeface="sans"
        android:textStyle="normal"
        android:maxLines="1" 
        android:gravity="center" 
        android:layout_gravity="center">
    </TextView> 
</LinearLayout>

然后在 LinearLayout 内的 GridView

<LinearLayout
        android:orientation="horizontal" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent"
        android:layout_marginTop="2dip"
        android:layout_gravity="center"
    android:gravity="center">   
        <GridView
            android:id="@+id/grid"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:numColumns="3"
            android:horizontalSpacing="4dp"
            android:verticalSpacing="4dp"
            android:stretchMode="spacingWidthUniform"/>
</LinearLayout>
于 2013-04-06T13:52:19.740 回答