2

编辑:这个问题已经解决,所以我原来的帖子中的代码不再适用。感谢所有做出贡献的人。

首先,我检查了其他类似的问题,但它们要么与我的不匹配,要么使用 BaseAdapter。我想要做的是将文本图像组合显示为 GridView 的一部分。实际的应用程序更大,但我的问题是 GridView 在第一个活动中是空白的!

如果有人可以快速查看并告诉我出了什么问题,我将不胜感激。

用于 GridView 元素的布局文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

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

    <TextView
        android:id="@+id/tv_grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

第一个Activity的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".CategoriesActivity" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="54dp"
        android:text="Select a category to learn more" />

    <TextView
        android:id="@+id/tv_grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="26dp"
        android:text="Lessons from History"
        android:textSize="18sp" />

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="25dp"
        android:numColumns="3" >
    </GridView>

</RelativeLayout>

最后,Java 文件:

package com.example.historicpersonalities;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

public class CategoriesActivity extends Activity {

    GridView gv_categories;
    public int selected; //which category is selected [0-4]?
    String[] data; //holds the data for GridView

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

        populate();
        selected = -1;

        gv_categories = (GridView) findViewById(R.id.gridView1);
        gv_categories.setAdapter(new MyAdapter(this, 
                android.R.layout.simple_expandable_list_item_1));

        gv_categories.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int index,
                    long arg3) {

            }
        });
    }

    class MyAdapter extends ArrayAdapter<String> {

        public MyAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View v = inflater.inflate(R.layout.layout_grid_scheme, null);

            TextView item = (TextView) findViewById(R.id.tv_grid);
            item.setText(data[position]);

            ImageView img = (ImageView) findViewById(R.id.iv_grid);
            img.setImageResource(R.drawable.dummy);

            Log.d("ankush", ""+position);

            return v;
        }

    }

    private void populate() {
        data = new String[5];
        data[0] = "Writers";
        data[1] = "Painters";
        data[2] = "Conquerors";
        data[3] = "Chemists";
        data[4] = "Actors";
    }
}
4

3 回答 3

2

我认为问题是你的gridView 的高度。GridView 是一个可滚动的容器,可以包含任意高度的任意数量的内容。尝试为您的 gridView 设置背景颜色,您会看到屏幕上没有 gridview。这是因为您将 wrap_content 用于gridview,但这是不正确的。

于 2013-06-26T14:18:44.083 回答
1

如果我没记错的话,似乎在您的构造函数中您没有将任何数据传递给适配器。

    public MyAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

在此代码片段中,您正在使用ArrayAdapter (Context context, int textViewResourceId)将空数组列表初始化为要在 GridView 中表示的对象。

public ArrayAdapter(Context context, int textViewResourceId) {
    init(context, textViewResourceId, 0, new ArrayList<T>());
}

因此,您的 GridView 应该为空。除此之外,您似乎没有正确实现 getView。(findViewById() 部分应按照 Opiatefuchs 的答案所示进行处理)

如果你想扩展 ArrayAdapter,你应该调用一个以对象数组作为参数的构造函数。(当然有很多方法可以制作自定义适配器,您可以扩展 BaseAdapter 或者在扩展 ArrayAdapter 时可以覆盖其他一些方法)

这样它应该可以工作:

class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            view = inflater.inflate(R.layout.layout_grid_scheme, null);
        } else {
            view = convertView;
        }

        TextView item = (TextView) view.findViewById(R.id.tv_grid);
        item.setText(getItem(position));

        ImageView img = (ImageView) view.findViewById(R.id.iv_grid);
        img.setImageResource(R.drawable.dummy);
    }

}
于 2013-06-26T16:49:59.213 回答
1

不知道这是否会导致问题,但您必须在适配器中设置您的 TextView 和 ImageView,如下所示:

    TextView item = (TextView) v.findViewById(R.id.tv_grid);
        item.setText(data[position]);

        ImageView img = (ImageView) v.findViewById(R.id.iv_grid);
        img.setImageResource(R.drawable.dummy);

编辑

首先,最好的方法是将所有三种解决方案结合起来。但是,我在您的 xml 布局中看到了另一个问题:您在您的 GridView 元素 xml 和您的活动布局 xml 中的 TextView 中放置了相同的 id。两个 TextView 都有 id="@+id/tv_grid" 。这永远行不通,将 id 更改为不同的

于 2013-06-26T13:58:35.823 回答