1

我正在开发我的第一个“专业”(即,全功能、无错误、美观的)Android 应用程序,但我在 Android 布局方面遇到了一些问题。

特别是,我有一个 gridView,我用一个包含 ImageView、TextView 和隐藏 TextView(可见性设置为“消失”)的布局来膨胀。

我有一个 115 x 115 的“找不到图像”图像。其他图像(“找到”)同样是 115 x 115。它们都是 JPEG。

问题是什么都没有。文本限制在 17 个字符以下。所以我认为图像大小相同,文本大小相同,单元格大小相同,网格会对齐......但是不;)

请参阅此处了解它现在的外观和此处了解相对布局的外观。

这和建议使用RelativeLayout。

网格视图:

     <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/gridView"
              android:numColumns="auto_fit"
              android:gravity="top"
              android:layout_gravity="top"
              android:padding="10dp"
              android:verticalSpacing="10dp"
              android:horizontalSpacing="10dp"
              android:columnWidth="50dp"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" >
    </GridView>
</LinearLayout>

细胞:

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/widget44"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="top"
        android:gravity="top">
    <ImageView
            android:id="@+id/icon_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="top"
            android:layout_gravity="top">
    </ImageView>
    <TextView
            android:id="@+id/icon_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:gravity="center_horizontal"
            android:textColorHighlight="#656565">
    </TextView>
    <TextView
            android:id="@+id/full_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:layout_gravity="top" >
    </TextView>
</RelativeLayout>

所以……可以肯定的是,我可能有一件事或几件事错了。但我可以使用你的帮助。谢谢。

编辑:有人建议我发布我的适配器代码,所以就在这里。

一、gridview活动:

package com.buildingfive.sharealike;


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.buildingfive.R;

public class BrowseSearchProducts extends Activity {
    GridView gridView;
    Cursor cursor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.browse_search);

        //get gridview data from db
        DBHelper db = new DBHelper(this);
        //this cursor is never really closed, everywhere I tried, GPF
        cursor = db.getReadableDatabase().rawQuery("SELECT _id, Title, Image FROM products;", null);
        cursor.moveToFirst();

        //populate gridview
        gridView = (GridView) findViewById(R.id.gridView);
        ListAdapter listAdapter = new ImageAdapter(this, cursor);
        ((ImageAdapter) listAdapter).setCount(cursor.getCount());
        gridView.setAdapter(listAdapter);

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                TextView vText = (TextView) v.findViewById(R.id.full_text);
                String strCaption = ((TextView) vText).getText().toString();

                Intent intent = new Intent(BrowseSearchProducts.this, ShowDetails.class);
                intent.putExtra("search", strCaption);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        cursor.close();
        this.finish();
        super.onDestroy();
    }
}

现在自定义 ImageAdapter:

package com.buildingfive.sharealike;

import android.content.Context;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.buildingfive.R;

public class ImageAdapter extends BaseAdapter {
    Context mContext;
    Cursor mCursor;
    int mCount;

    public static final int ACTIVITY_CREATE = 10;

    public ImageAdapter(Context c, Cursor cursor){
        mContext = c;
        mCursor = cursor;
    }

    public void setCount(int nCount) {
        this.mCount = nCount;
    }

    @Override
    public int getCount() {
        return mCount;
    }

    //also required
    public Object getItem(int position) {
        //should return the actual object at the specified position in our Adapter
        return mCursor.getString(1);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vwIconPlusCaption;
        String strCaption = mCursor.getString(1);
        String strFull = strCaption;

        if (strCaption == "")
            return null;

        //The Beckham Experiment: Blah Blah Blah 2ndary Tagline
        if (strCaption.indexOf(":") > -1)
            strCaption = strCaption.split(":")[0].toString();
        else
            if (strCaption.length() >= 17)
                strCaption = strCaption.substring(0, 17);

        if(convertView == null){
            LayoutInflater li;
            li = LayoutInflater.from(mContext);

            //icon_plus_caption is loaded into a view
            vwIconPlusCaption = li.inflate(R.layout.icon_plus_caption, null);
            TextView tv = (TextView) vwIconPlusCaption.findViewById(R.id.icon_text);

            //the view's caption set here
            tv.setText(strCaption);
            TextView fullText = (TextView) vwIconPlusCaption.findViewById(R.id.full_text);
            //passes the full title in a hidden ("gone") textview
            fullText.setText(strFull);
            ImageView iv = (ImageView) vwIconPlusCaption.findViewById(R.id.icon_image);

            byte[] bb = mCursor.getBlob(2);
            if (bb == null) {
                //image not found
                iv.setImageResource(R.drawable.not_found);
            } else {
                iv.setImageBitmap(BitmapFactory.decodeByteArray(bb, 0, bb.length));
            }

            if (position + 1 < mCount)
                mCursor.moveToNext();
        }
        else
        {
            vwIconPlusCaption = convertView;
        }
        return vwIconPlusCaption;
    }
}

编辑:已解决:解决方案如下:

出于某种原因,从 SQL lite 中提取所有图像与从 android 资源中提取“未找到”图像时,尺寸会有所不同。有关更多信息,请参阅此链接

我添加的行是:

            iv.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 115, 115, true));

...为了将 android drawable 的大小强制为 115 x 115。

感谢所有尝试参与的人。

4

0 回答 0