2015-10-08 8 views
5

मैं अपने प्रोजेक्ट में डेटा बाइंडिंग और रीसाइक्लर व्यू का उपयोग करता हूं। मेरे पास RecyclerView के लिए आधार एडाप्टर है। ऐसा लगता है कि यहRecyclerView.Adapter को ओवरड्राइड नहीं दिखता है BindViewHolder

public abstract class BaseAdapter<T extends ViewDataBinding> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> { 

    public BaseAdapter() {} 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     public T binding; 

     public ViewHolder(View view) { 
      super(view); 
      binding = DataBindingUtil.bind(view); 
     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     ... code ... 
     } 

} 

व्यूहोल्डर विस्तारित कक्षाएं केवल बाध्यकारी फ़ील्ड प्रकार को अलग करती हैं। विस्तारित BaseAdapter वर्ग के कार्यान्वयन के बाद:

public class BaseAdapterExtended extends BaseAdapter<BaseAdapterExtendedBinding> { 

    public BaseAdapterExtended(ArrayList<ItemModel> itemModels) { 
     super(); 
     mData = itemModels; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     return new ViewHolder(BaseAdapterExtendedBinding.inflate(inflater, parent, false).getRoot()); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     super.onBindViewHolder(holder, position); 
    } 

    @Override 
    protected View getItemRootView(ViewHolder holder) { 
     return holder.binding.item; 
    } 

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

मैं अगले संकलन त्रुटि मिल रहा हूँ:

error: BaseAdapterExtended is not abstract and does not override abstract method onBindViewHolder(BaseAdapter.ViewHolder,int) in Adapter 

लगता BaseAdapterExtended की तरह नहीं इस विधि है, लेकिन वह मौजूद है। अगर मैं

public void onBindViewHolder(ViewHolder holder, int position) 

को
public void onBindViewHolder(BaseAdapter.ViewHolder holder, int position) 

अनुमान ठीक संकलित बदलने के लिए, लेकिन बाध्यकारी बजाय BaseAdapterExtendedBinding ViewDataBinding किया जाएगा लिखें। ये क्यों हो रहा है? कोई विचार?

+0

क्या 'BaseAdapterExtended' में ViewHolder के लिए आयात? आप 'BaseAdapterExtended' में' GamesListAdapter' नामक एक कन्स्ट्रक्टर क्यों करते हैं? – Blackbelt

+0

क्षमा करें, मैं वस्तुओं का नाम बदलता हूं – Tiberal

+0

क्या आपने अपनी समस्या हल की है, मुझे अभी पूरे सप्ताह के लिए यह समस्या है और यह मुझे पागल कर रहा है: -/ – Strassenrenner

उत्तर

1

मेरे लिए ठीक काम करता है!

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    super.onBindViewHolder(holder, position); 
} 

ViewHolder की जगह BaseAdapterExtended.ViewHolder

6
इस पंक्ति में

है। कक्षा बनाने के दौरान मैंने अभी तक ViewHolder नहीं बनाया था, और यह उस विधि की त्रुटि को छोड़कर बहुत अनुमोदित था। यानी .:

public class FooAdapter extends RecyclerView.Adapter { 

public class FooAdapter extends RecyclerView.Adapter<FooAdapter.FooViewHolder> { 

करने के लिए बदल किया जा सकता था यह वैसे भी किया जा करने की जरूरत है, लेकिन केवल संकलक त्रुटि मुझे मिल गया onBindViewHolder में था।

9

मेरे मामले में मैं अपने सुपर क्लास parameterize करने के लिए भूल गया था के साथ: // तरह मेरी imageView

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) { 
     MyViewHolder myViewHolder1 = (MyViewHolder)viewHolder; 
     myViewHolder1.like.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "yay" + i, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
0

मुझे अभी इस अजीब मुद्दे का कारण पता चला है। यह मेरे प्रोजेक्ट में भी हो रहा है, लेकिन केवल एडाप्टर के लिए जो पैरामीट्रिज्ड हैं, जैसे आपका है। अन्य सभी एडेप्टरों ने कक्षा में व्यूहोल्डर को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता के बिना BindViewHolder() विधि को देखा। समाधान किसी भी यादृच्छिक param प्रकार के साथ ViewHolder क्लास को parametrize करने के लिए है, ऐसा लगता है कि यह एक बग है।

public abstract class BaseAdapter<T extends ViewDataBinding> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> { 

public BaseAdapter() {} 

public class ViewHolder<RandomTypeNotUsed> extends RecyclerView.ViewHolder { 

    public T binding; 

    public ViewHolder(View view) { 
     super(view); 
     binding = DataBindingUtil.bind(view); 
    } 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    ... code ... 
    } 

}

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