Как задать динамическое смещение курсора для 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;
    }

}

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

0 ответов

Другие вопросы по тегам