2017-04-08 109 views
0

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

我下面展示的代码:

[![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; 
} 

}

回答

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

我还没有遇到我们的代码,但显然这部分是负责在替代viewholders显示不同的看法,因为你正在服用modulus by 2,将返回给您0 for even numbers1 for odd numbers

做两件事情

  • return position % 10将加大对广告的时间间隔,你可以给任何 号码后其中U希望把广告。
  • 此外,使其与这种逻辑变化case 0 to adview1 to otherview完美工作。

这将解决您的问题。

+0

嗨穆罕默德,谢谢你的回答!当列表超过400个时,我仍然只有两行。看起来像显示adview时,不再有任何其他的东西。 – agustincola

+0

你有没有转换职位?广告一般为0,其他1为1。尝试一下,然后看看它会显示多少。 –

+0

嗨,穆罕默德,现在有了这个改变,我刚刚拿到了一行横幅:(我用改变代码编辑了我的问题 – agustincola