2014-11-10 2 views
1

Okey so, так как я не нашел последовательного способа сделать это, когда я искал, я решил, что, возможно, мой код для кого-то, что глаза, чтобы увидеть, может помочь.CursorAdapter с двумя строками строк

Я создаю игру, в которой вы используете карты. Эти карты могут быть заблокированы или разблокированы в зависимости от разных факторов. Важно то, что я хочу проверить sqlite db, заблокированы ли они, а затем отобразить разные макеты строк для двух возможных результатов.

Вот мой код:

public class AllCardsAdapter extends CursorAdapter { 

LockedHolder viewLocked; 
UnlockedHolder viewUnlocked; 
private LayoutInflater mInflater; 
public static final int LOCKED = 0; 
public static final int UNLOCKED = 1; 

public AllCardsAdapter(Context context, Cursor cursor) { 
    super(context, cursor); 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 

    final int type; 

    int viewType = this.getItemViewType(cursor.getInt(cursor.getColumnIndex("unlocked"))); 

    if (viewType == 1){ 
     type = UNLOCKED; 
    } else { 
     type = LOCKED; 
    } 

    if (type == LOCKED){ 
     viewLocked = (LockedHolder) view.getTag(); 
     viewLocked.nameHolder.setText(cursor.getString(cursor.getColumnIndex("name"))); 
     viewLocked.awardedAtHolder.setText("Awarded at level:"); 
     viewLocked.reqLvlHolder.setText(cursor.getString(cursor.getColumnIndex("reqlvl"))); 

     String imagePath = cursor.getString(cursor.getColumnIndex("image")); 

     if (imagePath.equals("card_obj_plus_1")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_1).placeholder(R.drawable.card_placeholder).into(viewLocked.imageHolder); 
     } 
     if (imagePath.equals("card_obj_plus_2")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_2).placeholder(R.drawable.card_placeholder).into(viewLocked.imageHolder); 
     } 
     if (imagePath.equals("card_obj_plus_3")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_3).placeholder(R.drawable.card_placeholder).into(viewLocked.imageHolder); 
     } 
     if (imagePath.equals("card_slowdown")){ 
      Picasso.with(context).load(R.drawable.card_slowdown).placeholder(R.drawable.card_placeholder).into(viewLocked.imageHolder); 
     } 
     if (imagePath.equals("card_speed_up")){ 
      Picasso.with(context).load(R.drawable.card_speed_up).placeholder(R.drawable.card_placeholder).into(viewLocked.imageHolder); 
     } 

    } else { 
     viewUnlocked = (UnlockedHolder) view.getTag(); 
     viewUnlocked.nameHolder.setText(cursor.getString(cursor.getColumnIndex("name"))); 

     String imagePath = cursor.getString(cursor.getColumnIndex("image")); 

     if (imagePath.equals("card_obj_plus_1")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_1).placeholder(R.drawable.card_placeholder).into(viewUnlocked.imageHolder); 
     } 
     if (imagePath.equals("card_obj_plus_2")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_2).placeholder(R.drawable.card_placeholder).into(viewUnlocked.imageHolder); 
     } 
     if (imagePath.equals("card_obj_plus_3")){ 
      Picasso.with(context).load(R.drawable.card_obj_plus_3).placeholder(R.drawable.card_placeholder).into(viewUnlocked.imageHolder); 
     } 
     if (imagePath.equals("card_slowdown")){ 
      Picasso.with(context).load(R.drawable.card_slowdown).placeholder(R.drawable.card_placeholder).into(viewUnlocked.imageHolder); 
     } 
     if (imagePath.equals("card_speed_up")){ 
      Picasso.with(context).load(R.drawable.card_speed_up).placeholder(R.drawable.card_placeholder).into(viewUnlocked.imageHolder); 
     } 

    } 

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    viewLocked = new LockedHolder(); 
    viewUnlocked = new UnlockedHolder(); 
    final int type; 

    int viewType = this.getItemViewType(cursor.getInt(cursor.getColumnIndex("unlocked"))); 

    if (viewType == 1){ 
     type = UNLOCKED; 
    } else { 
     type = LOCKED; 
    } 
    System.out.println(viewType); 
    System.out.println(type); 

    if (type == LOCKED){ 
     View lockedView; 
     lockedView = mInflater.inflate(R.layout.card_list_row_disabled, parent, false); 
     viewLocked.nameHolder = (TextView) lockedView.findViewById(R.id.txtTitle); 
     viewLocked.imageHolder = (ImageView) lockedView.findViewById(R.id.imgThumbnail); 
     viewLocked.reqLvlHolder = (TextView) lockedView.findViewById(R.id.tvLevelNr); 
     viewLocked.awardedAtHolder = (TextView) lockedView.findViewById(R.id.tvAwardedAt); 
     lockedView.setTag(viewLocked); 

     return lockedView; 
    } else { 
     View unlockedView; 
     unlockedView = mInflater.inflate(R.layout.card_list_row, parent, false); 
     viewUnlocked.nameHolder = (TextView) unlockedView.findViewById(R.id.txtTitle); 
     viewUnlocked.imageHolder = (ImageView) unlockedView.findViewById(R.id.imgThumbnail); 
     unlockedView.setTag(viewUnlocked); 

     return unlockedView; 
    } 

} 

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

@Override 
public int getItemViewType(int position) { 
    return position % 2; 
} 

public class LockedHolder { 
    public TextView nameHolder; 
    public ImageView imageHolder; 
    public TextView awardedAtHolder; 
    public TextView reqLvlHolder; 
} 

public class UnlockedHolder { 
    public TextView nameHolder; 
    public ImageView imageHolder; 
} 

} 

Ошибка я получаю в строке "viewLocked = (LockedHolder) view.getTag();"

AllCardsAdapter $ UnlockedHolder не может быть приведен к AllCardsAdapter $ LockedHolder

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

См. Я знаю, что он пытается сделать, я просто не знаю, почему. Кроме того, если я усложнять вещи без причины, или отсутствует что-то очевидное, я бы очень признателен, если вы найдете его ..

+0

Это потому, что тег представления для этой позиции установлен в UnlockedHolder, и вы пытаетесь вернуть его обратно в LockedHolder. Я попытался бы иметь один держатель вида и иметь условия внутри этого держателя вида, который определяет, как он обрабатывается. – zgc7009

ответ

1

реализация getItemViewType не выглядит правильно (тип не зависит от положения элемента) это должно быть что-то вроде следующего

private int getItemViewType(Cursor cursor) { 
    return cursor.getInt(cursor.getColumnIndex("unlocked")) % 2; 
} 

@Override 
public int getItemViewType(int position) { 
    Cursor cursor = (Cursor) getItem(position); 
    return getItemViewType(cursor); 
} 

Кроме того, необходимо обновить BindView и NewView

int viewType = this.getItemViewType(cursor); 
+1

Получил смысл и работал как шарм, спасибо! –

Смежные вопросы