2015-03-14 2 views
1

Я хочу показывать объявление каждый n элементов в моем RecyclerAdapter.Показать объявления по всем пунктам в RecyclerAdapter

Я ожидаю, что этот

|----- Item 0 -----| 
|------- AD -------| 
|----- Item 1 -----| 
|----- Item 2 -----| 
|----- Item 3 -----| 
|----- Item 4 -----| 
|----- Item 5 -----| 
|------ ... -------| 
|----- Item 15 ----| 
|------- AD -------| 
|----- Item 16 ----| 
|------ ... -------| 

Но с быстрой прокруткой я могу иметь что-то подобное

|----- Item 0 -----| 
|------- AD -------| 
|----- Item 1 -----| 
|----- Item 2 -----| 
|----- Item 3 -----| 
|------ ... -------| 
|---- Item 241 ----| 
|------- AD -------| 
|------ ... -------| 

Если я прокрутку медленно объявления отображаются через каждые 15 пунктов. Но если я быстро прокручиваю рекламу, отображаются неправильно. Например, объявление отображается после пункта № 241, а 241% 15 не равно 0.

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

Вот мой код адаптера.

public class MyCursorRecyclerAdapter extends CursorRecyclerAdapter<RecyclerView.ViewHolder> { 

private static final int AD_POS = 15; 

private Context mContext; 
private LayoutInflater mInflater; 

class ViewHolderItem extends RecyclerView.ViewHolder { 
    public TextView mTextView; 
    public LinearLayout mLayout; 

    public ViewHolderItem(View layout) { 
     super(layout); 
     mTextView = (TextView) layout.findViewById(R.id.text); 
     mLayout = (LinearLayout) layout.findViewById(R.id.main_linear_layout); 
    } 
} 

public MyCursorRecyclerAdapter(Context context, Cursor c) { 
    super(c); 
    mContext = context; 
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.listview_item_layout, parent, false); 

    return new ViewHolderItem(v); 
} 

@Override 
public void onBindViewHolderCursor(RecyclerView.ViewHolder holderDefault, Cursor cursor) { 

    int cursorPosition = cursor.getPosition(); 

    final ViewHolderItem holder = (ViewHolderItem) holderDefault; 
    final String text = cursorPosition + " : "+ cursor.getString(cursor.getColumnIndex(MyTable.MY_COLUMN)); 

    holder.mTextView.setText(text); 

    final ViewGroup layout = ((ViewHolderItem) holderDefault).mLayout; 

    if (cursorPosition % AD_POS == 0) { 
     NativeAd ad = new NativeAd(mContext, "ID"); 
     ad.setAdListener(new AdListener() { 
      @Override 
      public void onError(Ad ad, AdError error) {} 

      @Override 
      public void onAdLoaded(Ad ad) { 
       mInflater.inflate(R.layout.native_ad_layout, layout); 
       AdManager.inflateAd((NativeAd) ad, layout, mContext); 
      } 

      @Override 
      public void onAdClicked(Ad ad) {} 
     }); 
     ad.loadAd(); 
    } else { 
     int childCount = layout.getChildCount(); 
     if (layout.getChildAt(childCount-1).getId() == R.id.adUnit) { 
      layout.removeViewAt(childCount-1); 
     } 
    } 
} 
} 

ответ

3

Лучший способ - использовать метод getItemViewType(int position).

@Override 
public int getItemViewType(int position) { 
    if(cursorPosition % AD_POS == 0){ 
     return 0; 
    } 
    return 1; 
} 

И после того, что вы должны использовать viewType параметры в onCreateViewHolder методы, чтобы распознать, какой вид вы должны надуть, как показано в коде ниже:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if(viewType ==0){ 
     View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.listview_item_layout, parent, false);  
    } else if(viewType ==1){ 
     View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.different_layout, parent, false); 
    } 

    return new ViewHolderItem(v); 
} 

И дополнительно вы должны поддерживать вторую раскладку в ViewHolderItem или создать SecondViewHolderItem и вернуть надлежащее ViewHolder в методе выше и отличить его от правильного ViewHolder в onBindViewHolderCursor метод зависит от положения.

И вы должны учитывать эти предметы в методе getItemCount().

+0

Если у меня есть 100 элементов в моей базе данных, и я хочу показывать объявление каждые 10 элементов. У меня будет 110 элементов в моем списке? Или 100? Должен ли я переопределить getItemCount(), чтобы увеличить его на 10? – guillaume

+0

Да, я забыл об этом. Вы должны учитывать эти элементы в методе getItemCount() –

+0

@guillaume Сообщите мне, если это решение работает –

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