6

के साथ लिस्टव्यू में मूल एक्सप्रेस विज्ञापनों को कैसे कार्यान्वित करें मेरे पास कर्सर एडाप्टर के साथ सूचीदृश्य है। अब मैं सूची दृश्य में मूल एक्सप्रेस विज्ञापन लागू करना चाहता हूं।कर्सर एडाप्टर

मैं सरल baseAdapter साथ स्थानीय विज्ञापन वे के कार्यान्वयन को देखा है, कि आम तौर पर हम एडाप्टर और विज्ञापन जोड़ने के लिए getView() विधि के अंदर आइटम के प्रकार की जाँच करने के डेटा पारित करने के लिए List<Object> उपयोग कर रहे हैं।

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
     throws IllegalArgumentException { 
    Object item = getItem(position); 

    if (item instanceof Listing) { 
     // Listing items already have all the data required, so they just need to be displayed. 
        return listingLayout; 
    } else if (item instanceof AdPlacement) { 
     return ((AdPlacement) item).getView(convertView, parent); 
    } else { 
     // Any unknown items will cause exceptions, though this shouldn't ever happen. 
     throw new IllegalArgumentException(
       String.format("Adapter can't handle getView() for list item of type %s", 
         item.getClass().getName())); 
    } 


} 

CursorAdapter रूप CursorAdapter में इस हालत की जांच कैसे करें केवल कर्सर विवरण के साथ विधि newItem() है

@Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = LayoutInflater.from(context).inflate(R.layout.list_item_station, parent, false); 
     ViewHolder holder = new ViewHolder(); 

     v.setTag(holder); 
     return v; 
    } 

CursorAdapter में हर 10 आइटम

Bellow है के बाद स्थानीय विज्ञापनों को कैसे जोड़ें वर्तमान कोड मैं सूची में डेटा जोड़ने के लिए उपयोग कर रहा हूँ।

public class StationsCursorAdapter extends CursorAdapter{ 


    public StationsCursorAdapter(Context context) { 
     super(context, null, true); 
      } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = LayoutInflater.from(context).inflate(R.layout.list_item_station, parent, false); 
     ViewHolder holder = new ViewHolder(); 

     v.setTag(holder); 
     return v; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.titleTextView.setText(cursor.getString(cursor.getColumnIndex(Station.NAME))); 
    } 

    private static final class ViewHolder { 
       TextView titleTextView; 
      } 

} 

उत्तर

1

कार्यान्वयन आइटम आइटम थोड़ा और टाइप करें। आपको विभिन्न प्रकार के लेआउट को परिभाषित करना चाहिए, और फुला देना चाहिए। एक नज़र डालें RecyclerView Item Type

सही दृश्य Inflating बनाने के बाद, आप OnBind विधि में प्रकार की जांच कर सकते हैं, और प्रत्येक दृश्य के लिए एक और व्यवहार लागू कर सकते हैं।

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    if (holder instance of Dog) { 
     // Handle one case 
    } else { 
     // Handle other case 
    } 
} 
+0

लेकिन जब मैं कर्सर एडाप्टर का उपयोग कर रहा हूं तो मैं व्यू टाइप कैसे सेट कर सकता हूं? –

+0

@OmInfowave डेवलपर मूल रूप से, आप कई व्यूहोल्डर बनाते हैं। आपके कार्यान्वयन के लिए प्रत्येक। ViewHolderDog, ViewHolderCat। 'न्यू व्यू' में आप कर्सर से टाइप के बारे में कुछ जानकारी प्राप्त करेंगे, और फिर विशेष व्यूहोल्डर प्रकार वापस कर देंगे। फिर 'ऑनबिंड' में, आपको व्यूहोल्डर प्राप्त होगा, और आप जांचेंगे कि किस प्रकार का प्रकार है। – GensaGames

+0

, लेकिन मुद्दा कर्सर एडाप्टर है, यह सीधे कर्सर को एडाप्टर में पास करता है, मान लीजिए कि स्थानीय डेटाबेस में 22 आइटम हैं तो कर्सर आकार 22 है, फिर एडाप्टर आकार 22 है, अब मैं प्रत्येक 10 आइटम के बाद विज्ञापन जोड़ना चाहता हूं ताकि एडाप्टर आकार मुझे 24 हो। कर्सर एडाप्टर में इन दो अतिरिक्त आइटम को कैसे जोड़ें क्योंकि हम कर्सर मूल्य –

1

फ़ाइल list_item_native_ad.xml बनाएं।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="132dp"> 

    <com.google.android.gms.ads.NativeExpressAdView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/nativeAd" 
     ads:adSize="FULL_WIDTHx132" 
     ads:adUnitId="@string/native_ad_unit_id"/> 
</LinearLayout> 

अपने एडाप्टर के अंदर NativeAdViewHelper बनाएं।

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(); 
        if (mItemClickListener != null) { 
         Log.i(TAG, "onAdLoaded"); 
        } 
       } 

       @Override 
       public void onAdClosed() { 
        super.onAdClosed(); 
        if (mItemClickListener != null) { 
         Log.i(TAG, "onAdClosed"); 
        } 
       } 

       @Override 
       public void onAdFailedToLoad(int errorCode) { 
        super.onAdFailedToLoad(errorCode); 
        if (mItemClickListener != null) { 
         Log.i(TAG, "onAdFailedToLoad"); 
        } 
       } 

       @Override 
       public void onAdLeftApplication() { 
        super.onAdLeftApplication(); 
        if (mItemClickListener != null) { 
         Log.i(TAG, "onAdLeftApplication"); 
        } 
       } 

       @Override 
       public void onAdOpened() { 
        super.onAdOpened(); 
        if (mItemClickListener != null) { 
         Log.i(TAG, "onAdOpened"); 
        } 
       } 
      }); 
      AdRequest adRequest = new AdRequest.Builder() 
        .addTestDevice(MainActivity.TEST_DEVICE_ID) 
        .build(); 
      //You can add the following code if you are testing in an emulator 
      /*AdRequest adRequest = new AdRequest.Builder() 
       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
       .build();*/ 
      mNativeAd.loadAd(adRequest); 
     } 
    } 

अवहेलना विधि getItemViewType() अपने एडाप्टर के अंदर

@Override 
    public int getItemViewType(int position) { 
     if (position>1 && position % 3 == 0) {//in your case replace % 3 with % 10. 
      return NATIVE_AD_VIEW_TYPE; 
     } 
     return DEFAULT_VIEW_TYPE; 
    } 

अवहेलना विधि getViewTypeCount()

@Override 
public int getViewTypeCount() { 
      return 2; 
     } 
अपने newView() विधि के अंदर

@Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view; 
     LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
     switch (viewType) { 
      default: 
       view = layoutInflater 
         .inflate(R.id.content, parent, false); 
       return new ViewHolder(view); 
      case NATIVE_AD_VIEW_TYPE: 
       view = layoutInflater.inflate(R.layout.list_item_native_ad, parent, false); 
       return new NativeAdViewHolder(view); 
     } 
    } 

अपने bindView() विधि के अंदर

@Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     if (!(holder instanceof ViewHolder)) { 
      return; 
     } 
     holder.titleTextView.setText(cursor.getString(cursor.getColumnIndex(Station.NAME))); 
    } 

आशा है कि यह आप में मदद मिलेगी!

+0

उत्तर के लिए धन्यवाद। इश्यू लगता है कि कर्सर में 15 आइटम हैं, तो यह newView() विधि से 15 बार के लिए नई विधि() विधि को कॉल करें, इस विधि को नए व्यू() विधि से विज्ञापनों के रिटर्न व्यू के लिए एक अतिरिक्त समय कैसे कॉल करें। –

+0

@OmInfowave डेवलपर https://stackoverflow.com/a/40608363/392506 –

+0

@OmInfowave डेवलपर अगर आप –

1

मैं आपको सलाह दूंगा कि आप इस मामले के लिए कर्सर एडाप्टर का उपयोग न करें, क्योंकि यह अक्षम होगा, बल्कि आपको डाटाबेस से डेटा को एक सूची में ले जाना चाहिए, और कस्टमएडाप्टर को बेसएडाप्टर को तदनुसार दृश्यों को बाध्य करने के लिए उपयोग करना चाहिए।

और यदि आपको केवल कर्सर एडाप्टर का उपयोग करना है, तो आपको प्रत्येक 10 वीं स्थिति में विज्ञापन आइटम रखने के लिए अपने कर्सर डेटा को संशोधित करने की आवश्यकता है। आप अपने कर्सर को बदलने की तरह कर सकते हैं:

public Cursor getModifiedCursorWithAds(Cursor cursor) { 
     int size = cursor.getCount(); 
     MatrixCursor matrixCursor = new MatrixCursor(cursor.getColumnNames()); 
     int totalAds = size/10; 
     int negativeIds = -1; 
     cursor.moveToFirst(); 
     //assuming only two columns in cursor 
     for (int i = 0; i < (size + totalAds); i++) { 
      if (i % 10 == 0 && i != 0) { 
       matrixCursor.addRow(new String[]{"" + negativeIds--, "Ads data"}); //add dummy data for displaying ads(on the basis of negative ids, ad will be displayed 
      } else { 
       matrixCursor.addRow(new String[]{cursor.getString(0), cursor.getString(1)}); //add data from actual cursor, if you have more than 2 data modify this statement 
       cursor.moveToNext(); 
      } 
     } 
     cursor.close(); 
     return matrixCursor; 
    } 

विज्ञापनों और अन्य मदों के लिए अलग दृष्टिकोण लौट सकते हैं और bindView कॉलबैक में accordinly बाध्य करने के लिए संशोधित करें आप newview।

@Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view; 
     LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
     int viewType = cursor.getInt(0); 
     if (viewType >= 0) { 
      view = layoutInflater 
        .inflate(R.id.list_item_content, parent, false); 
      ViewHolder holder = new ViewHolder(); 
      view.setTag(holder); 
     } else { 
      view = layoutInflater.inflate(R.layout.list_item_native_ad, parent, false); 
      AdViewHolder holder = new AdViewHolder(); 

      view.setTag(holder); 
     } 
     return view; 
    } 

मैंने कोड के ऊपर परीक्षण नहीं किया है, इसलिए इसे काम करने के लिए कुछ बदलावों की आवश्यकता हो सकती है।

+0

से परिभाषित किया गया है तर्क के लिए धन्यवाद, यह सही दिखता है! आवेदन के प्रदर्शन के बारे में क्या है क्योंकि मेरे पास सूची में लगभग 1000 आइटम हैं? –

+0

बहुत कुशल नहीं है, क्योंकि आपको एक बार पूरे कर्सर डेटा को पार करना होगा। GetModifiedCursorWithAds की समय जटिलता ओ (एन) है जहां n कर्सर डेटा का आकार है। – abhishesh

संबंधित मुद्दे