RecyclerViewにてオブジェクトの型でViewTypeを判別したい。
タイトルの通りに、オブジェクト型のコレクションList<Object>
にRecyclerViewの要素となるオブジェクトを格納し、instanceof
を用いてViewType
を返すような以下のAdapterを書いたのですが、以下のエラーで表示できません。
エラー
java.lang.NullPointerException: Attempt to write to field 'int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null object reference
Adapterのコード
public class DragAdapter extends DragSortAdapter<FavoriteDragAdapter.ViewHolder> {
private List<Object> mItemList;
public DragAdapter(RecyclerView recyclerView) {
super(recyclerView);
}
@Override
public int getPositionForId(long l) {
return mItemList.indexOf((int) l);
}
@Override
public boolean move(int i, int i2) {
mItemList.add(i, mItemList.remove(i2));
return true;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view;
ViewHolder holder;
switch (viewType){
case 0:
view = inflater.inflate(R.layout.item_view_1, parent, false);
holder = new ViewHolder(this, view);
view.setTag(0);
view.setOnClickListener(holder);
view.setOnLongClickListener(holder);
return holder;
case 1:
view = inflater.inflate(R.layout.item_view_2, parent, false);
holder = new ViewHolder(this, view);
view.setTag(1);
view.setOnClickListener(holder);
view.setOnLongClickListener(holder);
return holder;
default:
return null;
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (holder.getItemViewType()){
case 0:
//Viewをセット
break;
case 1:
//Viewをセット
break;
}
}
@Override
public int getItemCount() {
return mItemList.size() > 0 ? mItemList.size() : 0;
}
@Override
public int getItemViewType(int position){
//instanceof オブジェクトのクラスを確認してそれぞれのフラグを返す。
if(mItemList.get(position) instanceof Hoge)
return 0;
else if(mItemList.get(position) instanceof Fuga)
return 1;
return -1;
}
/**
*リストを追加する関数。
* @param addData まとめて挿入したいデータ
*/
public void addAll(List<Object> addData){
mItemList.addAll(addData);
notifyDataSetChanged();
}
static class ViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
//@InjectView()....
public ViewHolder(DragSortAdapter adapter, View itemView){
super(adapter, itemView);
ButterKnife.inject(this, itemView);
}
@Override
public void onClick(View v) {
}
@Override
public boolean onLongClick(View v) {
startDrag();
return true;
}
@Override
public View.DragShadowBuilder getShadowBuilder(View itemView, Point touchPoint){
return new NoForegroundShadowBuilder(itemView, touchPoint);
}
}
}
ちなみに、こちらの外部ライブラリを継承しています。(https://github.com/vinc3m1/DragSortAdapter)
あとViewの読み込みにButterKnife
を使っています。 LayoutManager
はGridLayoutManager
です。 ①Object
型のListではRecyclerViewの要素を指定できないのでしょうか。 ②instanceof
では判別できないのでしょうか。 もしできないのであれば別の方法を教えて下さい。 よろしくおねがいします。