2017-04-08 3 views
0

にアイテムをロードするためにViewHolderAdapterを実装しましたが、一部の行にAdMob Bannerも表示します。私は2つの異なるのカスタムAdapterを作成しました。しかし問題は、アイテムリストが400アイテムよりも長い場合に、それぞれLayoutのために1つずつ、2つの行だけを表示することです。 誰かが私を助けることができますか?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 20 for even numbers1 for odd numbersが返されます。

二つ

  • return position % 10あなたは にuは広告を入れたいた後、任意の数を与えることができ、広告のための間隔を増加させるようにしてください。
  • また、このロジック変更で完全に動作させるにはcase 0 to adview1 to otherviewです。

これで問題は解決します。

+0

こんにちはムハンマド、あなたの答えに感謝します!リストに400以上の項目があるときは、まだ2行しか表示されません。 adviewを表示するときのように見えますが、それ以上のものは得られません。 – agustincola

+0

は位置を切り替えましたか?広告の場合は0、他の場合は1となります。試してみて、表示される数を確認してください。 –

+0

こんにちはムハンマド、その変更は今すぐバナーで1行だけを取得しました。(変更コードで私の質問を編集しました) – agustincola

関連する問題