在 ViewHolderAdapter 上加载项目

Load items on ViewHolderAdapter

我已经实现了 ViewHolderAdapter 来加载项目并将其显示在 ListView 上,但我还想在某些行中显示 AdMob Banner。我为两个不同的 Layouts 创建了自定义 Adapter。但问题是当项目列表超过 400 项时,只显示两行,每行 Layout。 有人可以帮助我吗?

我显示下面的代码:

[![enter image description here][1]][1]public class SubliguesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static List<Subligues> items;

public static class ClasGeneralViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    // Campos respectivos de un item

    public TextView subligue_name;
    public TextView created_at;
    public TextView members;
    public ImageView icon;


    public ClasGeneralViewHolder(View v) {
        super(v);

        subligue_name = (TextView) v.findViewById(R.id.txt_subligue_name);
        created_at = (TextView) v.findViewById(R.id.txt_created_at);
        members = (TextView) v.findViewById(R.id.txt_members);
        icon = (ImageView) v.findViewById(R.id.imageViewIcon);

        v.setOnClickListener(this);
    }

    public void onClick(View view){
        String subligue_name= items.get(getPosition()).getSubligueName();
        // Launch RegisterUser
        Intent intent = new Intent(view.getContext(),
                RegisterUser.class);
        // Pasar el nombre de la liga del usuario a RegisterUser.java
        intent.putExtra("subligue_name",subligue_name);
        view.getContext().startActivity(intent);
        ((Activity) view.getContext()).finish();
    }
}

public static class BannerViewHolder extends RecyclerView.ViewHolder{

    // Admob banner
    public AdView mAdView;

    public BannerViewHolder(View v) {
        super(v);
        mAdView = (AdView) v.findViewById(R.id.adView);
    }
}

@Override
public int getItemViewType(int position) {
    // here your custom logic to choose the view type
    return position %10;
}



public SubliguesAdapter(List<Subligues> items) {
    this.items = items;
}

@Override
public int getItemCount() {
    return items.size();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    switch (i) {
        case 0:
            View v2 = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.item_banner, viewGroup, false);
            return new BannerViewHolder(v2); // view holder for banner items;
        case 1:
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.activity_register_existente_abierta_card, viewGroup, false);
            return new ClasGeneralViewHolder(v); // view holder for normal items;
    }
    return null;
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int i) {

    switch (viewHolder.getItemViewType()) {
        case 0:
            BannerViewHolder viewHolder2 = (BannerViewHolder)viewHolder;
            AdRequest adRequest = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build();
            viewHolder2.mAdView.loadAd(adRequest);
            break;
        case 1:
            ClasGeneralViewHolder viewHolder0 = (ClasGeneralViewHolder)viewHolder;
            viewHolder0.subligue_name.setText(String.valueOf(items.get(i).getSubligueName()));
            String created_at = items.get(i).getCreatedAt().substring(0, items.get(i).getCreatedAt().length() - 9);
            viewHolder0.created_at.setText(created_at);
            viewHolder0.members.setText(String.valueOf(items.get(i).getMembers())+" ");

            new ImageDownloaderTask(viewHolder0.icon).execute(items.get(i).getIcon());
            break;
    }


}

class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public ImageDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadBitmap(params[0]);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                } else {
                    Drawable placeholder = imageView.getContext().getResources().getDrawable(R.drawable.no_team);
                    imageView.setImageDrawable(placeholder);
                }
            }
        }
    }
}
private Bitmap downloadBitmap(String url) {
    HttpURLConnection urlConnection = null;
    try {
        URL uri = new URL(url);
        urlConnection = (HttpURLConnection) uri.openConnection();
        int statusCode = urlConnection.getResponseCode();
        if (statusCode != HttpStatus.SC_OK) {
            return null;
        }

        InputStream inputStream = urlConnection.getInputStream();
        if (inputStream != null) {
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
    } catch (Exception e) {
        urlConnection.disconnect();
        Log.w("ImageDownloader", "Error downloading image from " + url);
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }
    return null;
}

}

@Override
public int getItemViewType(int position) {
    // here your custom logic to choose the view type
    return position %2;
}

我没有 运行 你的代码,但显然这部分负责显示替代 viewholders 的不同视图,因为你正在使用 modulus by 2,这将 return 你 0 for even numbers1 for odd numbers.

做两件事

  • return position % 10 将增加您可以提供的广告的间隔 您要在其后放置广告的任意数字。
  • 也为了让它与这个逻辑变化完美配合 case 0 to adview1 to otherview.

这将解决您的问题。