2017-01-10 9 views
1

私は2人のarraylistを持っています。私は同じrecyclerview内の両方のリストにデータを表示したいと思います。私のコードはこのように見えます。1つのカスタムアダプターにrecyclerviewの2つの配列リストを取り込みます

マイアダプタ

class NotificationAdapter extends  RecyclerView.Adapter<NotificationViewHolder> { 
//.. 
List<Notification> notifList = new ArrayList<>(); 
List<AcceptedInvitation> acceptedInvitations = new ArrayList<>(); 
Context context; 
LayoutInflater inflater; 

public NotificationAdapter(Context context){ 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 

public void addNotification(Notification notification){ 
    notifList.add(notification); 
    notifyDataSetChanged(); 
    notifyItemInserted(notifList.size()); 
} 

public void addAcceptedInvitation(AcceptedInvitation invitation){ 
    acceptedInvitations.add(invitation); 
    notifyDataSetChanged(); 
    notifyItemInserted(acceptedInvitations.size()); 
} 

@Override 
public NotificationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.rv_notifications, parent, false); 

    NotificationViewHolder holder = new NotificationViewHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(final NotificationViewHolder holder, int position) { 
    String user1= null; 
    String user2= null; 

    if(position < notifList.size()){ 

     user1= notifList.get(position).getUserName(); 

    }else { 
     user2= acceptedInvitations.get(position).getUserName(); 

    } 


@Override 
public int getItemCount() { 
    return notifList.size() + acceptedInvitations.size(); 
} 
} 

RecyclerView ViewHolder

public class NotificationViewHolder extends RecyclerView.ViewHolder { 
//.. 
TextView userName; 

public NotificationViewHolder(View itemView) { 
    super(itemView); 

    userName = (TextView) itemView.findViewById(R.id.display_name); 
} 
} 

私はonBindViewHolder()の部分に誤りがあります。私はFirebaseを使ってデータを検索しています。

主な活動(アクティビティの開始時にloaddataのは()と呼ばれている)

public void loadData(){ 
    //.. 
    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference ref = database.getReference().child("users").child(key).child("invitations"); 

    ref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Notification notification = dataSnapshot.getValue(Notification.class); 
      adapter.addNotification(notification); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 


    DatabaseReference invitationRef = database.getReference().child("users").child(key).child("acceptedInvitations"); 
    invitationRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      AcceptedInvitation acceptedInvitation = dataSnapshot.getValue(AcceptedInvitation.class); 
      Toast.makeText(getActivity(), dataSnapshot.getValue().toString(), Toast.LENGTH_LONG).show(); 
      adapter.addAcceptedInvitation(acceptedInvitation); 

     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

私はすでに招待状とacceptedInvitations JSONアレイからデータを取得することができますが、私は、データを移入しようとしたとき、私はエラーを持っていますacceptedInvitationsから、私が "addAcceptedInvitation(acceptedInvitation)"を呼び出すときに基本的に。
エラー。

スレッドID = 1:捕捉されない例外で終了スレッド(グループ= 0x41a81c80)

+0

エラーは何ですか? –

+0

エラーの最も高いリスクは 'user2 = acceptedInvitations.get(position).getUserName();'であり、 'acceptedInvitations'が' position'に値を持つ前にこの行が呼び出される可能性があります。あなたが 'addNotification'と' addAcceptedInvitation'と呼んでいるあなたの質問に言及するコードを編集してください.Firebaseからのデータであれば、Firebase – koceeng

+0

を呼び出した場所にコードを記述してください。私はすでに私の質問を編集しました。 –

答えて

0

私はあなたがNotificationデータとAcceptedInvitationデータを結合したいと仮定します。 2つのFirebaseデータベース呼び出しを呼び出すと、最初の呼び出しが完了した後に2つ目の呼び出しが実行されます。したがって、以下のコードを使用することは大丈夫です(そうでなければ、このコードは危険です)。それはnotifyDataSetChanged()直後に呼ばれていた場合、それは全く使用されないよう

まず、addNotificationaddAcceptedInvitationnotifyItemInserted()を削除します。しかし、notifyItemInserted()のままにしてnotifyDataSetChanged()を削除する方がより複雑になります。

次に、何が間違っているかを指摘できます。 notifyDataSetChanged()に電話すると、アダプタはすべてのアイテムを更新します。 getItemCount()には、アダプタに(notifList.size() + acceptedInvitations.size())が含まれていると記載されています。したがって、3つのnotifListと2 acceptedInvitationsがある場合、アダプタは最初の値から(3 + 2)番目の値に更新されます。

onBindViewHolderは、positionの値が0から4(0は最初、4は5番目)で呼び出されます。コードを見て:positionは0又は1又は2である場合、そのものがインデックスにnotifList.get(position)notifListを実行する存在であるため、それが微細であること

@Override 
public void onBindViewHolder(final NotificationViewHolder holder, int position) { 
    ... 
    if(position < notifList.size()){ 
     user1 = notifList.get(position).getUserName(); 

    } else { 
     user2 = acceptedInvitations.get(position).getUserName(); 
    } 
} 

注意。 positionが3の場合でも、そのはacceptedInvitationsのみ3

のインデックス0の値と1ないを持っているので、それを理解した後、エラーをtrigerすることacceptedInvitations.get(position)を実行し、あなたのコードは次のようになります。

@Override 
public void onBindViewHolder(final NotificationViewHolder holder, int position) { 
    ... 
    if(position < notifList.size()){ 
     user1 = notifList.get(position).getUserName(); 

    } else { 
     user2 = acceptedInvitations.get(position - notifList.size()).getUserName(); 
    } 
} 

希望これをヘルプ:

+0

2つ以上のリストをアダプターに入れなければならないケースがあります。 。私はこのコードを追加しようとしました** user2 = acceptedInvitations.get(position - listA.size()+ listB.size())。getUserName(); **しかし、それは動作しません。私は途中で3つのリストを持っています。 –

+0

3つのリストがある場合は、もちろんコードは異なります。私は私の答えにそのコードを思いつく理由を論理に入れました。注意深く読んで理解し、コードロジックがまだ同じであれば、 'user2 = acceptedInvitations.get(position-listA.size()+ listB.size()+ listC.size())。getUserName(); 'うまくいく – koceeng

関連する問題