2011-12-12 33 views
42

Tôi đang cố gắng tạo một bảng con tùy chỉnh sẽ sử dụng hai bố cục khác nhau tùy thuộc vào một số dữ liệu trong con trỏ. Tôi tiếp tục đọc về 'ghi đè getViewTypeCount() và getItemViewType()' để thực hiện điều này nhưng tôi dường như không thể tìm ra cách thực hiện điều này ..cursoradapter với bố trí hàng khác nhau

Đây là mã của tôi cho bindView và phương thức Xem mới:

@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: Bây giờ tôi đã làm việc này, nhưng tôi muốn chọn những gì rowlayout sử dụng tùy thuộc vào một số dữ liệu trong con trỏ và tôi không thể làm việc đó .. ai có một số ý tưởng?

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

bạn đang cố gắng để thêm phần/tiêu đề để bạn xem danh sách? Mark Murphy đã thực sự dễ dàng sử dụng bộ điều hợp danh sách kết hợp cwac-merge có thể hữu ích. – csaunders

+0

Không, tôi có 2 bố trí khác nhau và đôi khi tôi muốn sử dụng layout1 nếu mCursor.getString (mCursor.getColumnIndex ("type")). Bằng ("1") và tôi muốn sử dụng layout2 khi mCursor.getString (mCursor.getColumnIndex ("type")). bằng ("2") – jagsler

+0

Nếu bạn muốn, bạn có thể chỉ cần lấy hai con trỏ riêng biệt. Một trong những nơi loại == 1 và một cho nơi mà loại == 2. Đó là khu ổ chuột, nhưng nó có thể giúp bạn di chuyển về phía trước. – csaunders

Trả lời

89

Vì vậy, cuối cùng tôi đã làm việc. Đối với những người quan tâm đến đoạn code làm việc dưới:

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

getItem (vị trí) gọi moveToPosition (vị trí) trên đối tượng con trỏ bên trong và tôi nghi ngờ nó quá đắt để được gọi thường xuyên . Bạn có làm cho nó trôi chảy trôi chảy với điều này trong ứng dụng của bạn? –

+2

Yep cuộn trôi chảy. Tìm thấy mã như thế này trong mã nguồn Android. – jagsler

+0

@jagsler Tôi đang cố gắng để đạt được một cái gì đó tương tự, bạn có nhận thấy một vấn đề mà trong khi di chuyển bố cục xem được thay đổi bằng cách nào đó? – kabuto178

2

Hãy xem điều này example, bạn có thể dễ dàng điều chỉnh để giải quyết vấn đề của mình. Nó khá đơn giản.

+0

Cảm ơn ví dụ. Tôi nghĩ rằng tôi hiểu (hầu hết một phần của) mã được đưa ra trong ví dụ nhưng tôi nhận được bối rối tại thời điểm mà tôi không có một phương pháp getView nhưng một phương pháp newView và bindView .. làm thế nào tôi có thể thực hiện các mã được đưa ra trong ví dụ trong trường hợp của tôi? – jagsler

+1

CursorAdapter có triển khai thực hiện getView() đại diện cho newView() và bindView(), theo cách như thực thi mẫu tái chế hàng. Vì vậy, trong newView(), bạn sẽ tạo ViewHolder cho hàng và liên kết nó với setTag(). Trong bindView(), bạn sẽ lấy ViewHolder qua getTag(); ở cuối bạn chỉ cần thích nghi/chia nhỏ cùng một logic giữa 2 phương thức. Bận bây giờ, nhưng tôi có thể viết một số mã tối nay trong trường hợp bạn cần ... – gwa

+0

Cảm ơn thông tin! Tôi sẽ tự mình thử nó trước nhưng tôi sẽ cho bạn biết nếu không làm cho nó hoạt động. – jagsler

0

Một giải pháp khả thi về việc truy cập vào các con trỏ trong phương pháp getItemViewType như sau:

@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; 
} 
Các vấn đề liên quan