2017-04-08 3 views
0

Ich habe eine ViewHolderAdapter implementiert, um Elemente zu laden und auf einer ListView anzuzeigen, aber ich möchte auch eine AdMob Banner in einigen Zeilen anzeigen. Ich habe eine benutzerdefinierte Adapter für zwei verschiedene Layouts erstellt. Aber das Problem ist, dass nur zwei Zeilen angezeigt werden, eine für jede Layout, wenn die Elementliste länger als 400 Elemente ist. Jemand kann mir helfen?Artikel auf ViewHolderAdapter laden

zeige ich den Code unten:

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

}

Antwort

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

Ich habe nicht ur-Code laufen, aber deutlich ist dieser Teil verantwortlich für die verschiedenen Ansichten in alternativen viewholders Anzeige, weil Sie einnehmen modulus by 2, die Ihnen 0 for even numbers und 1 for odd numbers zurückgibt.

zwei Dinge tun

  • return position % 10 wird für Anzeigen erhöhen Intervall Sie wonach eine beliebige Zahl geben kann u setzen Anzeige geschaltet werden soll.
  • Auch damit es funktioniert perfekt mit dieser Logik ändern case 0 to adview und 1 to otherview.

Dies wird Ihr Problem lösen.

+0

Hallo Muhammad, danke für deine Antwort! Ich bekomme immer noch nur zwei Zeilen, wenn die Liste mehr als 400 Einträge enthält. Sieht so aus, als wenn die Adview nicht mehr angezeigt wird. – agustincola

+0

hast du die Positionen gewechselt? Wie 0 für die Anzeige und 1 für die andere. Probieren Sie es aus und sehen Sie, wie viele es zeigen wird. –

+0

Hallo Muhammad, mit dieser Änderung habe ich jetzt nur eine Zeile mit dem Banner bekommen :(. Ich habe meine Frage mit dem Änderungscode bearbeitet. – agustincola