Firebase数据列表无法在Custom recycler adaper中加载

时间:2017-11-18 17:19:04

标签: android firebase recycler-adapter

我正在尝试在我的自定义回收器适配器中加载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 个答案:

答案 0 :(得分:1)

每次通过firebase调用获取子项时,将调用

onChildAdded()。这是异步过程。

在您的代码中,您将其添加到ArrayList<>,但不知何故,您没有通知adapter 该孩子正在添加。在你的

中这样做是安全的
private void fetchData(DataSnapshot dataSnapshot) {
   AuthorsCLA listItem = dataSnapshot.getValue(AuthorsCLA.class);
   authorlist.add(listItem);
   adapter.notifyItemInserted(authorlist.size() - 1); // Notify the adapter
}