2017-01-10 1 views
1

두 명의 arraylist가 있고 같은 recyclerview의 두 목록에 데이터를 표시하려고합니다. 내 코드는 다음과 같습니다.하나의 사용자 지정 어댑터에 recyclerview의 두 배열 목록 채우기

내 어댑터

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 배열에서 데이터를 검색 할 수 있습니다,하지만 난 오류가 기본적으로 "addAcceptedInvitation (acceptedInvitation)"을 호출하면 acceptedInvitations에서 가져옵니다.
오류.

threadid = 1 : 캐치되지 않는 예외로 종료 스레드 (그룹 = 0x41a81c80)

+0

무엇이 오류입니까? –

+0

가장 위험한 오류는'user2 = acceptedInvitations.get (position) .getUserName();'이며이 줄은'acceptedInvitations'가'position'에 값을 가지기 전에 호출됩니다.'addNotification'과'addAcceptedInvitation'라고 불리는 코드에 대한 질문을 편집하고, Firebase의 데이터가 있다면 Firebase – koceeng

+0

에 전화해서 코드를 입력하십시오. 답을 찾아 주셔서 감사합니다. 이미 내 질문을 편집했습니다. –

답변

0

난 당신이 Notification 데이터와 AcceptedInvitation 데이터를 결합하려는 가정합니다. Firebase 데이터베이스 호출을 두 번 호출하면 두 번째 호출은 첫 번째 호출이 완료된 후에 실행됩니다. 따라서 아래 코드를 사용하는 것이 좋습니다. 그렇지 않은 경우이 코드는 위험합니다. 그것은이 notifyDataSetChanged() 직후라고하면 아무 소용이 없기 때문에

첫째, addNotification 내부 notifyItemInserted()addAcceptedInvitation를 제거합니다. 그러나 notifyItemInserted()을 유지하고 notifyDataSetChanged()을 삭제하는 것이 더 복잡 할 수 있습니다.

그런 다음 잘못된 점을 지적하십시오. notifyDataSetChanged()으로 전화하면 어댑터가 모든 항목을 새로 고칩니다. getItemCount()에는 어댑터에 (notifList.size() + acceptedInvitations.size())이 있다고 언급되어 있습니다. 따라서 3 notifList과 2 acceptedInvitations이있는 경우 어댑터는 첫 번째 값에서 (3 + 2) 다섯 번째 값으로 새로 고칩니다.

onBindViewHolderposition 값이 0에서 4 (0이 먼저, 4가 5가됩니다)로 호출됩니다. 코드를 살펴 :

@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는 0 또는 1 또는 2 인 경우는 존재한다 그 인덱스에 notifList.get(position)notifList을 실행하기 때문에, 그것은 좋은입니다. 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

두 개 이상의 목록으로 어댑터를 채워야 할 경우가 있습니다. . 이 코드를 추가하려고 시도했습니다 ** user2 = acceptedInvitations.get (position - listA.size() + listB.size()). getUserName(); ** 그러나 작동하지 않습니다. 나는 3 개의리스트를 가지고있다. –

+0

목록이 3 개있는 경우 물론 코드가 다릅니다. 내 대답에 그 코드가 왜 생겼는지 논리를 포함했습니다. 주의 깊게 읽고 그것을 이해하고 코드 로직이 여전히 동일하다면'user2 = acceptedInvitations.get (position - listA.size() + listB.size() + listC.size()). getUserName(); '효과가있다. – koceeng

관련 문제