Android 在自定义视图中,作为子级的线性布局不可见

Android 在自定义视图中,作为子级的线性布局不可见,android,android-linearlayout,android-custom-view,Android,Android Linearlayout,Android Custom View,我想创建一个自定义布局。我使用简单的适配器。当适配器创建文本视图时,所有内容都可见。但是,当我作为孩子将LinearLayout与TextView一起使用时,不会显示任何内容。我怎样才能解决这个问题 package com.example.TApp.demo; import android.content.Context; import android.database.DataSetObserver; import android.util.AttributeSet; import andr

我想创建一个自定义布局。我使用简单的适配器。当适配器创建文本视图时,所有内容都可见。但是,当我作为孩子将LinearLayout与TextView一起使用时,不会显示任何内容。我怎样才能解决这个问题

package com.example.TApp.demo;

import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;

/**
 * Created by ChessMax on 18.07.2014.
 */
public class StudyGrid extends ViewGroup
{
    private StudyGridAdapter mAdapter;

    public StudyGrid(Context context) {
        super(context);
    }

    public StudyGrid(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public StudyGrid(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        int itemWidth = 50;
        int itemHeight = 50;

        for(int i=0;i<mAdapter.getCount();i++){
            View child = mAdapter.getView(i, null, this);

            AdapterView.LayoutParams p = (AdapterView.LayoutParams)             child.getLayoutParams();
            if (p == null) {
                p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT, 0);
            }

            addViewInLayout(child, i, p, true);

            child.layout(itemWidth * i, 0, (i+1) * itemWidth, itemHeight);
        }
        this.invalidate();
    }

    public void setAdapter(StudyGridAdapter adapter)
    {
        mAdapter = adapter;
        requestLayout();
    } 
}    

package com.example.TApp.demo;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.TApp.R;

import java.util.List;

/**
 * Created by ChessMax on 18.07.2014.
 */
public class StudyGridAdapter extends ArrayAdapter<StudyData>
{
    private LayoutInflater mInflater;

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

    public StudyGridAdapter(Context context, int resource, int textViewResourceId) {
        super(context, resource, textViewResourceId);
        init(context);
    }

    public StudyGridAdapter(Context context, int textViewResourceId, StudyData[]     objects) {
        super(context, textViewResourceId, objects);
        init(context);
    }

    public StudyGridAdapter(Context context, int resource, int textViewResourceId,     StudyData[] objects) {
        super(context, resource, textViewResourceId, objects);
        init(context);
    }

    public StudyGridAdapter(Context context, int textViewResourceId, List<StudyData>     objects) {
        super(context, textViewResourceId, objects);
        init(context);
    }

    public StudyGridAdapter(Context context, int resource, int textViewResourceId,     List<StudyData> objects) {
        super(context, resource, textViewResourceId, objects);
        init(context);
    }

    private void init(Context context) {
        mInflater = (LayoutInflater)     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            return createViewFromResource(position, convertView, parent);
    }

    private View createViewFromResource(int position, View convertView, ViewGroup     parent) {
        View view;
        TextView text = null;
        int resource = R.layout.study_cell;

        if (convertView == null) {
            view = mInflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }
        try {
            if (view instanceof LinearLayout)
            {
                LinearLayout layout = (LinearLayout)view;

                layout.setLayoutParams(new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT,     LinearLayout.LayoutParams.WRAP_CONTENT));

                int count = layout.getChildCount();
                for (int i = 0; i <= count; i++) {
                    View v = layout.getChildAt(i);
                    if (v instanceof TextView)
                    {
                        text = (TextView) v;
                        break;
                    }
                }
            }
            else
            {
                text = (TextView) view;
            }
        } catch (ClassCastException e) {
            Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
            throw new IllegalStateException(
                    "ArrayAdapter requires the resource ID to be a TextView", e);
        }

        if (text != null)
        {
            StudyData item = getItem(position);
            if (item instanceof CharSequence) {
                text.setText((CharSequence)item);
            } else {
                text.setText(item.toString());
            }
        }

        return view;
    }    
}

package com.example.TApp.demo;

/**
 * Created by ChessMax on 18.07.2014.
 */
public class StudyData
{
    private int num;

    public StudyData(int num)
    {
        this.num = num;
    }

    @Override
    public String toString()
    {
        return Integer.toString(num);
    }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">

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

    </TextView>

</LinearLayout>

package com.example.TApp;

import android.app.Activity;
import android.os.Bundle;
import com.example.TApp.demo.StudyData;
import com.example.TApp.demo.StudyGrid;
import com.example.TApp.demo.StudyGridAdapter;

import java.util.ArrayList;

/**
 * Created by ChessMax on 18.07.2014.
 */
public class TestActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);

        ArrayList<StudyData> list = new ArrayList<StudyData>();
        list.add(new StudyData(5));
        list.add(new StudyData(6));
        list.add(new StudyData(7));

        StudyGridAdapter adapter = new StudyGridAdapter(this, R.layout.study_cell,     list);

        StudyGrid grid = (StudyGrid) findViewById(R.id.studyGrid);
        grid.setAdapter(adapter);
    }
}

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

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

    <com.example.TApp.demo.StudyGrid
        android:id="@+id/studyGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
package com.example.TApp.demo;
导入android.content.Context;
导入android.database.DataSetObserver;
导入android.util.AttributeSet;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AbsListView;
导入android.widget.AdapterView;
/**
*ChessMax于2014年7月18日创建。
*/
公共类StudyGrid扩展了视图组
{
私人研究机构;
公共研究网格(上下文){
超级(上下文);
}
public StudyGrid(上下文、属性集属性){
超级(上下文,attrs);
}
public StudyGrid(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
仅受保护的void布局(布尔值已更改、int l、int t、int r、int b)
{
int itemWidth=50;
int itemHeight=50;

对于(inti=0;i检查线性布局方向。如果是水平的,则只能看到一个充气视图


根视图linearlayout的方向必须是垂直的。

您给定的TextView是空的,没有id,您的linearlayout也是。您希望显示什么?我在
createViewFromResource
方法中更改TextView文本。因此,它应该显示3个数字:5、6、7。如上所述,如果我从study_单元格中删除linearlayout,它将被删除anes仅使用TextView,一切正常。