2015-10-08 10 views
5

私は自分のプロジェクトでDataBindingsとRecyclerViewを使用します。 私はRecyclerView用のベースアダプターを持っています。このようになります。RecyclerView.AdapterはオーバーライドされたonBindViewHolderを表示しません

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 ... 
     } 

} 

ViewHolder拡張クラスはバインディングフィールドタイプのみが異なります。 は、拡張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(); 
    } 
} 

私は次のコンパイルエラーを持っています:BaseAdapterExtendedは、このメソッドをしていないよう

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

は思えるが、彼は存在しています。 私は罰金コンパイル

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); 
} 

が、私は私のスーパークラスをパラメータ化するために忘れていた私の場合は BaseAdapterExtended.ViewHolder

6

です。クラスを作成するとき、私はまだViewHolderを作成していませんでした。そのメソッドのエラーを除いては非常に許容的でした。すなわち:

public class FooAdapter extends RecyclerView.Adapter { 

これはとにかく行われるために必要な

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

に変更する必要がありましたが、私が得ただけでコンパイルエラーがonBindViewHolderにありました。

9

でViewHolderを置き換える://が好き は私の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

私はちょうどこの奇妙な問題の理由を知りました。これは私のプロジェクトでも起こっていますが、あなたのようにパラメータ化されたアダプタの場合のみです。他のすべてのアダプターは、クラス内のViewHolderを明示的に指定する必要はなく、BindViewHolder()メソッドを見ました。解決方法は、ViewHolderクラスを任意のランダムなパラメータタイプでパラメータ化することです。これはバグのようです。

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 ... 
    } 

}

関連する問題