Cursoradapter с различными строками строк

Я пытаюсь создать настраиваемый cursoradapter, который будет использовать два разных макета в зависимости от некоторых данных в курсоре. Я продолжаю читать о «переопределении getViewTypeCount () и getItemViewType ()», чтобы это произошло, но я не могу понять, как это реализовать.

Это мой код для bindView и новых методов View:

@Override public void bindView(View view, Context context, Cursor cursor) { TextView tView = (TextView) view.findViewById(R.id.TextView1); tView.setText("The text"); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mInflater.inflate(R.layout.item1, parent, false); } 

,

EDIT: теперь у меня это работает, но я хочу выбрать, что использовать rowlayout в зависимости от некоторых данных в курсоре, и я не могу заставить это работать. У кого-нибудь есть идеи?

 @Override public int getItemViewType(int position) { return position % 2; } @Override public int getViewTypeCount() { return 2; } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); holder.txtAddress .setText("blabla"); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder holder = new ViewHolder(); View v = null; int type = cursor.getPosition() % 2; if(type == 0) { v = mInflater.inflate(R.layout.item, parent, false); } else { v = mInflater.inflate(R.layout.item2, parent, false); } holder.txtAddress = (TextView) v.findViewById(R.id.tvName); v.setTag(holder); return v; } 

Solutions Collecting From Web of "Cursoradapter с различными строками строк"

Так что, наконец, я получил работу. Для тех, кого интересует рабочий код:

 private int getItemViewType(Cursor cursor) { String type = cursor.getString(cursor.getColumnIndex("type")); if (type.equals("1")) { return 0; } else { return 1; } } @Override public int getItemViewType(int position) { Cursor cursor = (Cursor) getItem(position); return getItemViewType(cursor); } @Override public int getViewTypeCount() { return 2; } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); holder.textView .setText(cursor.getString(cursor.getColumnIndex("body"))); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder holder = new ViewHolder(); View v = null; if (cursor.getString(cursor.getColumnIndex("type")).equals("1")) { v = mInflater.inflate(R.layout.message1, parent, false); holder.textView = (TextView) v .findViewById(R.id.textView1); } else { v = mInflater.inflate(R.layout.message2, parent, false); holder.textView = (TextView) v .findViewById(R.id.textView2); } v.setTag(holder); return v; } public static class ViewHolder { public TextView textView; } 

Взгляните на этот пример , вы можете легко адаптировать его для решения своей проблемы. Это довольно просто.

Другим возможным решением относительно доступа к курсору в методе getItemViewType является следующее:

 @Override public int getChildType(int groupPosition, int childPosition) { Cursor c = getChild(groupPosition, childPosition); if(c.getString(c.getColumnIndex(Contract.MyColumn)).equals("value")) return 0; else return 1; }