2017-11-18 8 views
0

firebase 데이터 목록을 사용자 지정 리사이클 러 어댑터에로드하려고하는데로드 할 수 없습니다.Firebase 데이터 목록을 사용자 지정 리사이클러에로드 할 수 없습니다.

이 코드는 내 logcat에 데이터를 표시하지만 내 응용 프로그램에서는로드 할 수 없습니다. logcat에 오류가 표시되지 않습니다. firebase UI를 사용하여이 작업을 시도하면 문제가 없지만 리사이클 뷰에서 네이티브 광고를 삽입하여 사용자 지정 어댑터로 마이그레이션해야하므로이 문제가 발생합니다. :(

내 사용자 지정 리사이클 adapet.

public class AuthorNameCustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

ArrayList<AuthorsCLA> authorlist; 
Context mcontext; 


public class NamesHolder extends RecyclerView.ViewHolder { 
    public TextView name; 

    public NamesHolder(View itemView) { 

     super(itemView); 
     name = (TextView)itemView.findViewById(R.id.authorNameTextView); 
    } 
} 

public AuthorNameCustomRecyclerAdapter(ArrayList<AuthorsCLA> authorlist, Context mcontext) { 
    this.authorlist = authorlist; 
    this.mcontext = mcontext; 
} 


@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder = null; 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    switch (viewType) { 
     case 1: { 
      View view = inflater.inflate(R.layout.author_list_cv, parent, false); 
      viewHolder = new NamesHolder(view); 
      break; 
     } 
    } 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    final AuthorsCLA authorsModel = authorlist.get(holder.getAdapterPosition()); 



    switch (holder.getItemViewType()){ 
     case 1:{ 
      NamesHolder nameHolder = (NamesHolder) holder; 
      nameHolder.name.setText(authorsModel.getAuthorname()); 
      nameHolder.name.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(view.getContext(), AuthorQuotesDetailActvity.class); 
        mcontext.startActivity(intent); 



       } 
      }); 
     } 
    } 
} 



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

} 여기

내가 정의 재활용 어댑터를 호출하고있는 클래스입니다.

public class AuthorsList extends AppCompatActivity { 

private RecyclerView recyclerViewAuthor; 
private StaggeredGridLayoutManager mlayoutManager; 
private GridLayoutManager manager; 
FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference mdatabaseReference = database.getReference(); 
private AdView mAdView; 
private RecyclerView.Adapter adapter; 
private ArrayList<AuthorsCLA> authorlist; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.authors_list); 
    MobileAds.initialize(this, "ca-app-pub-7854400750152181~4721849113"); 
    mAdView = (AdView) findViewById(R.id.adView1); 
    AdRequest adRequest = new AdRequest.Builder().addTestDevice("2A79E20CADE70C60CF36B2E8EE9103FF").build(); 
    mAdView.loadAd(adRequest); 


    recyclerViewAuthor = (RecyclerView) findViewById(R.id.authorsRecyclerView); 

    DatabaseReference mListItemRef = mdatabaseReference.child("en/of"); 

    authorlist = new ArrayList<>(); 


    manager = new GridLayoutManager(this,2); 

    recyclerViewAuthor.setLayoutManager(manager); 


    ChildEventListener childEventListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      Log.d("Added",dataSnapshot.getKey()); 
      fetchData(dataSnapshot); 

     } 

     @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) { 

     } 
    }; 

    mListItemRef.addChildEventListener(childEventListener); 


    adapter = new AuthorNameCustomRecyclerAdapter(authorlist, this); 

    recyclerViewAuthor.setAdapter(adapter); 



} 

private void fetchData(DataSnapshot dataSnapshot) { 

    AuthorsCLA listItem=dataSnapshot.getValue(AuthorsCLA.class); 
    authorlist.add(listItem); 
    // recyclerViewAuthor.setAdapter(adapter); 

} 

}

답변

1

onChildAdded()하는 것 firebase 호출로 자식을 가져올 때마다 호출됩니다. 이것은 비동기입니다. 공정한 과정. 코드에서

당신은 ArrayList<>, 로를 추가하지만, 어떻게 든 당신은 아이가 추가되고있는 adapter를 통지하지 않습니다. 당신의

private void fetchData(DataSnapshot dataSnapshot) { 
    AuthorsCLA listItem = dataSnapshot.getValue(AuthorsCLA.class); 
    authorlist.add(listItem); 
    adapter.notifyItemInserted(authorlist.size() - 1); // Notify the adapter 
} 
+0

응용 프로그램 오류 '시도에 추락있어에서 –

+0

reference' null 객체에'INT android.support.v7.widget.RecyclerView $ ViewHolder.mItemViewType를 '필드에 기록 할 그렇게하는 것이 안전합니다. .. 왜냐하면 당신의 코드에서 의미가없는'itemType'에 의해'ViewHolder'를 생성하기 때문입니다. 'onCreateViewHolder()'와'onBindViewHolder()'메소드 모두에서 itemType의 switch case를 제거해보십시오. – Wizard

+0

,하지만 내가 말했듯이 나는 리사이틀보기의 목록 항목 사이에 광고를 추가하고 스위치 문을 제거하면 어떻게 광고를 추가 할 수 있습니까? 스위치 문을 다시 추가하면 광고를 추가하는 동안 작동합니까? –