Android GridView为空

时间:2013-06-26 13:41:02

标签: android android-gridview

编辑:此问题已得到解决,因此原始帖子中的代码不再适用。感谢所有贡献的人。

首先,我检查了其他类似的问题,但它们要么与我的不匹配,要么使用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>

第一个活动的布局文件:

<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";
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不知道这是否会导致问题,但您必须在适配器中设置Your 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布局中看到了另一个问题:您将相同的ID放入GridView元素xml和您的Activity布局xml中的T​​extView。两个TextView都得到id =“@ + id / tv_grid”。这可能永远不会有效,将id改为不同的

答案 2 :(得分:1)

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

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

在此代码段中,您正在使用ArrayAdapter (Context context, int textViewResourceId)初始化空的arraylist作为要在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);
    }

}