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>

最初のアクティビティのレイアウト ファイル:

<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 がないことがわかります。gridview に wrap_content を使用しているためですが、正しくありません。

于 2013-06-26T14:18:44.083 に答える
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);

編集

まず、最善の方法は、3 つのソリューションをすべて組み合わせることです。しかし、あなたの xml レイアウトで別の問題を見てきました: GridView 要素 xml とアクティビティ レイアウト xml 内の TextView に同じ id を配置します。両方の TextViews が id="@+id/tv_grid" を取得しました。これはうまくいきません。ID を別のものに変更してください

于 2013-06-26T13:58:35.823 に答える
1

私が間違っていなければ、コンストラクターではアダプターにデータを渡さないようです。

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

このコード スニペットでは、GridView で表すオブジェクトとして空の配列リストを初期化するArrayAdapter (コンテキスト コンテキスト、int textViewResourceId)を使用しています。

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 に答える