Android LazyLoading Gridview图像标题?

时间:2013-04-06 13:03:26

标签: android gridview android-image

我目前正在创建一个应用程序,我想从数据库中加载数据列表,然后在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

我希望有人可以帮我纠正这个问题因为它真的很烦人,提前谢谢:)

2 个答案:

答案 0 :(得分:0)

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

不相关但scaleType的{​​{1}}可能会派上用场。

答案 1 :(得分:0)

这是我使用的方法,用于显示一个网格,其中包含3张适合设备的图片,每张图片都有标题TextView。

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

我的所有照片都是纵横比为1.5的肖像,例如300像素高,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>

然后在GridL里面的一个LinearLayout

<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>