cursoradapter с разным расположением строк - PullRequest
44 голосов
/ 12 декабря 2011

Я пытаюсь создать пользовательский курсорный адаптер, который будет использовать два разных макета в зависимости от данных в курсоре.Я продолжаю читать о «переопределении 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);
}

.

РЕДАКТИРОВАТЬ: Теперь у меня все получилось, но я хочу выбрать, какую строку использовать в зависимости от некоторых данных в курсоре, и я могуУ меня получилось? У кого-нибудь есть идеи?

@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;
}

Ответы [ 3 ]

92 голосов
/ 23 декабря 2011

Так что я наконец-то заработал. Для интересующихся рабочий код приведен ниже:

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;
}
2 голосов
/ 13 декабря 2011

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

0 голосов
/ 23 февраля 2015

Другое возможное решение относительно доступа к курсору в методе 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...