2014-10-08 2 views
0

두 가지 종류의 데이터 중 하나를 구분 기호로 표시하는 목록보기가 있습니다. 각 데이터 유형은 하나의 배열 목록에 저장됩니다. 따라서 두 가지 목록이 있습니다. 각 목록의 내용은 특수 행 (구분 기호)을 사용하여 다른 목록과 구분됩니다. 첫 번째 행은 분리 기호 행입니다. getView에서 나는 정상적인 데이터 행과 구분자 행을 구별해야합니다.구분 기호로 ViewHolder 패턴을 구현하는 방법은 무엇입니까?

// returns true if a separator row must be displayed at pos. 
private boolean isSeperator(int pos) { 
     return pos == 0 || pos == data.size() + 1; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater infalInflater = (LayoutInflater) this.context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if(isSeperator(position)) { 
     convertView = infalInflater.inflate(R.layout.list_view_seperator, parent, false); 
     TextView seperator = (TextView) convertView.findViewById(R.id.tv_list_view_seperator); 
     seperator.setText("Seperator"); 
    } 
    else { 
     convertView = infalInflater.inflate(R.layout.my_layout, parent, false); 

     TextView txtview = (TextView) convertView.findViewById(R.id.foo); 
     ImageView icon = (ImageView) convertView.findViewById(R.id.bar); 

     MyData myData = (MyData) getItem(position); 
     txtview.setText(myData.getName()); 
     icon.setImageBitmap(myData.getIcon()); 
    } 

    return convertView; 
} 

먼저 분리 기호가 현재 위치에 표시되어야하는지 확인합니다. 이것은 잘 작동합니다.

뷰 홀더 패턴을 구현하려고했지만 계속 실패합니다. 구분자를 포함하여 여러 유형의 행을 고려해야하는 경우에이 패턴을 사용하는 방법을 보여줄 수 있습니까?

+0

다음은 Google의 예입니다. https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/SimpleSectionedListAdapter.java – harism

답변

3

, 나는 강하게 당신이이 Adapter에서 viewType 메커니즘을 사용 할 것을 권장합니다. 그래서, 당신은 이미 View의 한 종류를 제공 어댑터가있는 경우, 당신은 대체 할 수 있습니다 : 당신의 getView()가 호출 될 때

private final static int TYPE_SEPARATOR = 0; 
private final static int TYPE_ITEM = 1; 


@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    return isSeparator(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
} 

이 방법은, 당신이 convertView의 올바른 유형 (계속 또한 null이 될 수있을 것이다) 다음과 같이하면 괜찮을 것입니다.

private final LayoutInflater mInflater; 

public MyAdapter(Context context) { 
    mInflater = LayoutInflater.from(context); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (isSeparator(position)) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_separator, parent, false); 
     } 

     setupSeparator(convertView); 
    } else { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_item, parent, false); 
     } 

     setupListItem(convertView, position); 
    } 

    return convertView; 
} 

private boolean isSeparator(int position) { 
    return position == 0 || position == data.size() + 1; // Is the + 1 needed here? 
} 
+0

이 솔루션은 저에게 효과적입니다. 또한 필자의 정형화 기술을 향상시킬 수있다 : P. – null

1

행이 구분 기호 (첫 번째 또는 마지막)인지 여부를 판별하는 조건이 주어지면이 목록에 포함될 필요가없는 것처럼 보입니다.

당신이 목록을 스크롤 할 분리기를 필요로하는 경우 (이 당신이 ListView.setAdapter(ListAdapter listAdapter)하기 전에 설정해야합니다) 대신 ListView.addHeader(View view)ListView.addFooter(View view)을 사용하는 것이 좋습니다. 당신 9 월에게 rators을 구현하려면

+0

안녕하세요, 저는이 메소드와 ListView를 알고 있습니다. addHeader (보기보기)'는 실제로 좋은 해결책이 될 것입니다. 그러나 두 번째 분리 기호는 내 두 목록의 내용 사이에 위치하며 목록보기 끝 부분에 두지 않아야합니다. 각 구분 기호는 다음 행의 제목입니다. – null

+0

두 개의 ListView가 있습니까? "두리스트"란 무엇을 의미합니까? – ataulm

+0

@ataulm 그는 내가 말할 수있는 한 그가이 하나의 어댑터에 두 가지 소스의 데이터를 혼합한다는 것을 의미합니다. – rock3r

관련 문제