【问题标题】:Android LazyLoading Gridview Images with title?带有标题的Android LazyLoading Gridview图像?
【发布时间】:2013-04-06 13:03:25
【问题描述】:

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

我拥有的文件如下:

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

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

【问题讨论】:

    标签: android gridview android-image


    【解决方案1】:

    这是我用来显示包含 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>
    

    然后在你的 GridView 里面的一个 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>
    

    【讨论】:

    • 我正在尝试实现代码,我想我快到那里了多变的”?我需要在顶部初始化它吗?谢谢
    • 好的,我想我快到了,我只需要知道如何修改您的解决方案,这样我就可以拥有自己的图像并在 1dp 内显示,有什么想法吗?
    • 对于 PARAMS 声明,我是这样声明的:boldLinearLayout.LayoutParams params;
    • 我刚刚将我的参数声明添加到上面的适配器摘录中,很抱歉没有包括它。不太清楚你所说的“图像本身”是什么意思。这应该是一个 3-wide 布局,4dp 间距填充屏幕宽度。
    【解决方案2】:

    Exception 是由 import 错误的 LayoutParams 子类引起的。也许最简单的方法是明确写new LinearLayout.LayoutParams(

    不相关但ImageView 中的scaleType 可能会派上用场。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2019-09-25
      相关资源
      最近更新 更多