2014-07-18 6 views
0

사용자 지정 레이아웃을 만들고 싶습니다. 나는 간단한 어댑터를 사용한다. 어댑터가 TextView를 만들면 모든 것이 보입니다. 그러나 TextView와 함께 LinearLayout을 자식으로 사용하면 아무 것도 표시되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?사용자 지정보기에서 자식으로 LinearLayout이 보이지 않습니다.

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> 
+0

주어진 TextView는 비어 있으며 ID가 없으므로 LinearLayout도 마찬가지입니다. 무엇을 보여줄 것으로 예상 했습니까? – Simas

+0

'createViewFromResource' 메서드 내에서 TextView 텍스트를 변경했습니다. 따라서 위에 표시된 것처럼 3 번 숫자가 표시됩니다. 위에서 언급 한 것처럼 study_cell에서 LinearLayout을 제거하고 TextView로만 remanes하면 모든 것이 예상대로 작동합니다. – ChessMax

답변

1

선형 배치 방향을 확인하십시오. 그게 수평이라면, 하나의 팽창 된 뷰만 볼 수 있습니다.

루트 뷰 선형 레이아웃 방향은 수직이어야합니다.

관련 문제