2012-08-02 3 views
3

저는 ListActivity에서 텍스트 값 목록 만 표시하는 아주 간단한 ListView를 사용하고 있습니다. 여기에 내 현재 코드가있다 :ListView에 Android에서 두 가지 이상의 행 레이아웃 유형이있을 수 있습니까?

ListActivity를 사용하기 때문에 InfoActivity 용 XML 파일에 아무 것도 없다.

내가 원하는 것은 행에 대한 맞춤 레이아웃을 만드는 것입니다. 첫 번째 5 개의 행에는 layoutA.xml이 있고 두 번째 5 개의 행에는 layoutB.xml이 있습니다.

어떻게하면됩니까? 나는 어디에서 시작 해야할지 모르겠다. 분명히 나는 ​​가능한 가장 단순한 코드를 찾고있다.

+0

가능한 중복 : http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row – Ixx

답변

2

이 방법은 간단합니다. ArrayAdapter를 확장하기 만하면됩니다. 내 ArrayAdapter와는 다르게 두 가지를 수행합니다

  • 의 getView()가 위치를 확인하고 적절한 리소스를로드 내 어댑터는 ResourceIds
  • 의 배열을 대신 하나 개의 ResourceId를 전달

    이것은 사소한 예. 첫 번째 절반이 한쪽으로 보이고 두 번째 절반이 다른 것보다 더 복잡하게 만들 계획이라면 getViewTypeCount()getItemViewType()을 무시해야합니다.

    근무 예 :

    public class Example extends Activity { 
        public class MyArrayAdapter<T> extends ArrayAdapter<T> { 
         LayoutInflater mInflater; 
         int[] mLayoutResourceIds; 
    
         public MyArrayAdapter(Context context, int[] textViewResourceId, List<T> objects) { 
          super(context, textViewResourceId[0], objects); 
          mInflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
          mLayoutResourceIds = textViewResourceId; 
         } 
    
         @Override 
         public View getView(int position, View convertView, ViewGroup parent) { 
          if (convertView == null && position > 2) 
           convertView = mInflater.inflate(mLayoutResourceIds[1], parent, false); 
          return super.getView(position, convertView, parent); 
         } 
        } 
    
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         String[] array = new String[] {"one", "two", "three", "four", "five", "six"}; 
         List<String> list = new ArrayList<String>(); 
         Collections.addAll(list, array); 
    
         ListView listView = new ListView(this); 
         listView.setAdapter(new MyArrayAdapter<String>(this, new int[] {android.R.layout.simple_list_item_1, android.R.layout.simple_list_item_single_choice}, list)); 
         setContentView(listView); 
        } 
    } 
    
    0

    나는 당신이 카운터가있는 경우, 0에서 시작하는 말과 5에서 layoutB.xml으로 팽창 layoutA.xml를 스크랩 할 때 다음 부풀려 다음 layoutA.xml와 처음 다섯을 다시 생각합니다. 그것은 할 수있을만큼 간단해야합니다. 물론 BaseAdapter을 통해이 문제에 대해 이야기하고 있습니다. ListView에 각 행을 설정하는 어댑터를 만들 수 있습니다. 실제로는 ListActivity을 사용한 적이 없습니다. 그러나 과정은 동일해야합니다.

    @lxx 게시 된 링크를 추가하면, 원하는 링크를 얻는 데 도움이됩니다. 비록 당신이 한 종류의 5 가지, 다른 5 가지를 원할 때, 나는 그러한 생각들을 과도하게 사용한다고 말할 것입니다. 확실히이 링크를 좋은 기준선으로 사용하고 카운터 만 사용하십시오. 간단 해. 메모리 측면에서, 카운터가 이미 5 개의 뷰를 넣었을 때 레이아웃을 다시 팽창시킵니다. 그렇게하면 매번 그렇게하지 않을 것입니다.

    2

    귀하의 목록 항목에 다른 레이아웃을 갖는 것에 대한 훌륭한 블로그 게시물입니다. 구성 및 예제를 시도 할 수 있도록

    handling-listviews-with-multiple-row-types

    또한, 샘플 프로젝트가있다.

    0

    당신은 하나의 ListView에서 서로 다른 레이아웃과 여러 어댑터를 가질 수 MergeAdapter (cwac 병합)를 사용하려고 할 수 있습니다.

    0

    목록 뷰에서 다른 유형의 뷰를 표시해야하는 경우 뷰를 전환하는 대신 getViewTypeCount() 및 getItemViewType()을 사용하는 것이 좋음 VIEW.GONE 및 VIEW.VISIBLE은 getView 내부에서 매우 비싼 작업이 될 수 있습니다.()는 목록 스크롤에 영향을 미칩니다.

    어댑터에서 getViewTypeCount() 및 getItemViewType()을 사용하려면이 항목을 확인하십시오.

    링크 : the-use-of-getviewtypecount

    관련 문제