Как задать динамическое смещение курсора для ListView
Я пытаюсь научиться различным видам проектов с открытым исходным кодом и пытаюсь немного отредактировать. Однако в этой части я застрял. Здесь проблема.
В проекте есть ListView, который заполняется RSS-фидом. Адаптер курсора адаптирован как адаптер списка. Я пытаюсь понять, как нативная реклама admob может использоваться в списках. Я пытаюсь сделать так:
Пример представления о желании достичь
Объявление в картинках размещено мной. Однако на месте объявления пропущен элемент. Например: размещение элементов в списке должно быть 1-3-4-5 и т. Д. Но я получаю 1-2-3-4 в качестве их размещения. 2 место должно быть зарезервировано для рекламы.
Вот код, который я использую:
public class EntriesCursorAdapter extends ResourceCursorAdapter {
private static final int LIST_ITEM = 0;
private static final int AD_ITEM = 1;
// private static int currentAdCount;
// private static int prevAdCount;
private final Uri mUri;
private final boolean mShowFeedInfo;
private int mIdPos, mTitlePos, mMainImgPos, mDatePos, mIsReadPos, mFavoritePos, mFeedIdPos, mFeedNamePos;
public EntriesCursorAdapter(Context context, Uri uri, Cursor cursor, boolean showFeedInfo) {
super(context, R.layout.item_entry_list, cursor, 0);
mUri = uri;
mShowFeedInfo = showFeedInfo;
reinit(cursor);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent){
View view;
LayoutInflater layoutInflater = LayoutInflater.from(context);
switch (getItemViewType(cursor.getPosition())){
default:
view = layoutInflater.inflate(R.layout.item_entry_list, parent, false);
return view;
case AD_ITEM:
view = layoutInflater.inflate(R.layout.ad_entry_list, parent, false);
return (new NativeAdViewHolder(view)).getView();
}
}
@Override
public void bindView(View view, final Context context, Cursor cursor) {
switch (getItemViewType(cursor.getPosition())) {
case AD_ITEM:
break;
default:
if (view.getTag(R.id.holder) == null) {
ViewHolder holder = new ViewHolder();
holder.titleTextView = (TextView) view.findViewById(android.R.id.text1);
holder.dateTextView = (TextView) view.findViewById(android.R.id.text2);
holder.mainImgView = (ImageView) view.findViewById(R.id.main_icon);
holder.starImgView = (ImageView) view.findViewById(R.id.favorite_icon);
view.setTag(R.id.holder, holder);
}
final ViewHolder holder = (ViewHolder) view.getTag(R.id.holder);
String titleText = cursor.getString(mTitlePos);
if(titleText == null)
return;
holder.titleTextView.setText(titleText);
final long feedId = cursor.getLong(mFeedIdPos);
String feedName = cursor.getString(mFeedNamePos);
String mainImgUrl = cursor.getString(mMainImgPos);
mainImgUrl = TextUtils.isEmpty(mainImgUrl) ? null : NetworkUtils.getDownloadedOrDistantImageUrl(cursor.getLong(mIdPos), mainImgUrl);
ColorGenerator generator = ColorGenerator.DEFAULT;
int color = generator.getColor(feedId); // The color is specific to the feedId (which shouldn't change)
String lettersForName = feedName != null ? (feedName.length() < 2 ? feedName.toUpperCase() : feedName.substring(0, 2).toUpperCase()) : "";
TextDrawable letterDrawable = TextDrawable.builder().buildRect(lettersForName, color);
if (mainImgUrl != null) {
Glide.with(context).load(mainImgUrl).centerCrop().placeholder(letterDrawable).error(letterDrawable).into(holder.mainImgView);
} else {
Glide.clear(holder.mainImgView);
holder.mainImgView.setImageDrawable(letterDrawable);
}
holder.isFavorite = cursor.getInt(mFavoritePos) == 1;
holder.starImgView.setVisibility(holder.isFavorite ? View.VISIBLE : View.INVISIBLE);
if (mShowFeedInfo && mFeedNamePos > -1) {
if (feedName != null) {
holder.dateTextView.setText(Html.fromHtml("<font color='#247ab0'>" + feedName + "</font>" + Constants.COMMA_SPACE + StringUtils.getDateTimeString(cursor.getLong(mDatePos))));
} else {
holder.dateTextView.setText(StringUtils.getDateTimeString(cursor.getLong(mDatePos)));
}
} else {
holder.dateTextView.setText(StringUtils.getDateTimeString(cursor.getLong(mDatePos)));
}
if (cursor.isNull(mIsReadPos)) {
holder.titleTextView.setEnabled(true);
holder.dateTextView.setEnabled(true);
holder.isRead = false;
} else {
holder.titleTextView.setEnabled(false);
holder.dateTextView.setEnabled(false);
holder.isRead = true;
}
}
}
public void toggleReadState(final long id, View view) {
final ViewHolder holder = (ViewHolder) view.getTag(R.id.holder);
if (holder != null) { // should not happen, but I had a crash with this on PlayStore...
holder.isRead = !holder.isRead;
if (holder.isRead) {
holder.titleTextView.setEnabled(false);
holder.dateTextView.setEnabled(false);
} else {
holder.titleTextView.setEnabled(true);
holder.dateTextView.setEnabled(true);
}
new Thread() {
@Override
public void run() {
ContentResolver cr = MainApplication.getContext().getContentResolver();
Uri entryUri = ContentUris.withAppendedId(mUri, id);
cr.update(entryUri, holder.isRead ? FeedData.getReadContentValues() : FeedData.getUnreadContentValues(), null, null);
}
}.start();
}
}
public void toggleFavoriteState(final long id, View view) {
final ViewHolder holder = (ViewHolder) view.getTag(R.id.holder);
if (holder != null) { // should not happen, but I had a crash with this on PlayStore...
holder.isFavorite = !holder.isFavorite;
if (holder.isFavorite) {
holder.starImgView.setVisibility(View.VISIBLE);
} else {
holder.starImgView.setVisibility(View.INVISIBLE);
}
new Thread() {
@Override
public void run() {
ContentValues values = new ContentValues();
values.put(EntryColumns.IS_FAVORITE, holder.isFavorite ? 1 : 0);
ContentResolver cr = MainApplication.getContext().getContentResolver();
Uri entryUri = ContentUris.withAppendedId(mUri, id);
cr.update(entryUri, values, null, null);
}
}.start();
}
}
@Override
public void changeCursor(Cursor cursor) {
reinit(cursor);
super.changeCursor(cursor);
}
@Override
public Cursor swapCursor(Cursor newCursor) {
reinit(newCursor);
return super.swapCursor(newCursor);
}
@Override
public void notifyDataSetChanged() {
reinit(null);
super.notifyDataSetChanged();
}
@Override
public void notifyDataSetInvalidated() {
reinit(null);
super.notifyDataSetInvalidated();
}
private void reinit(Cursor cursor) {
if (cursor != null && cursor.getCount() > 0) {
mIdPos = cursor.getColumnIndex(EntryColumns._ID);
mTitlePos = cursor.getColumnIndex(EntryColumns.TITLE);
mMainImgPos = cursor.getColumnIndex(EntryColumns.IMAGE_URL);
mDatePos = cursor.getColumnIndex(EntryColumns.DATE);
mIsReadPos = cursor.getColumnIndex(EntryColumns.IS_READ);
mFavoritePos = cursor.getColumnIndex(EntryColumns.IS_FAVORITE);
mFeedNamePos = cursor.getColumnIndex(FeedColumns.NAME);
mFeedIdPos = cursor.getColumnIndex(EntryColumns.FEED_ID);
}
}
private static class ViewHolder {
public TextView titleTextView;
public TextView dateTextView;
public ImageView mainImgView;
public ImageView starImgView;
public boolean isRead, isFavorite;
}
public class NativeAdViewHolder extends RecyclerView.ViewHolder{
private final NativeExpressAdView mNativeAd;
public NativeAdViewHolder(View itemView){
super(itemView);
mNativeAd = (NativeExpressAdView) itemView.findViewById(R.id.nativeAd);
mNativeAd.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
}
@Override
public void onAdClosed() {
super.onAdClosed();
}
@Override
public void onAdFailedToLoad(int errorCode) {
super.onAdFailedToLoad(errorCode);
}
@Override
public void onAdLeftApplication() {
super.onAdLeftApplication();
}
@Override
public void onAdOpened() {
super.onAdOpened();
}
});
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("377AD5A033DEF8521D8DAFBCD9E3A267")
.build();
mNativeAd.loadAd(adRequest);
}
public View getView(){
return mNativeAd;
}
}
@Override
public int getItemViewType(int position){
return position % 10 == 1 ? AD_ITEM: LIST_ITEM;
}
@Override
public int getViewTypeCount() {
return 2;
}
}
Извините за плохой английский и если это плохой пост. Пожалуйста, оставляйте комментарии, если вы думаете, что этот пост может быть улучшен.