【发布时间】:2019-09-23 13:54:44
【问题描述】:
我想通过来自 firebase 的数据进行 recyclerview。我的 firebase 数据库结构如下所示。
但是,我的代码未能将数据导入 recyclerview。我花了很多时间解决问题。它看起来像 addValueEventListenr 问题。我不知道为什么,但这个听众没有继续。
适配器类
public class SymbolAdapter extends RecyclerView.Adapter<SymbolAdapter.SymbolHolder>{
ArrayList<Symbol> symbol_list;
public SymbolAdapter(ArrayList<Symbol> symbol_list){
this.symbol_list = symbol_list;
}
@NonNull
@Override
public SymbolHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_item, parent, false);
return new SymbolHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SymbolHolder holder, int position) {
Symbol symbol = symbol_list.get(position);
holder.symbol.setText(symbol.getSymbol());
holder.companyName.setText(symbol.getCompanyName());
}
@Override
public int getItemCount() {
return symbol_list.size();
}
class SymbolHolder extends RecyclerView.ViewHolder {
TextView symbol, companyName;
public SymbolHolder(@NonNull View itemView){
super(itemView);
symbol = itemView.findViewById(R.id.symbol);
companyName = itemView.findViewById(R.id.companyName);
}
}
}
符号类
public class Symbol {
private String symbol;
private String companyName;
public Symbol(){
}
public Symbol(String symbol, String companyName){
this.symbol = symbol;
this.companyName = companyName;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
}
搜索片段
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search, container, false);
recyclerView = view.findViewById(R.id.search_item_recylerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setHasFixedSize(true);
list = new ArrayList<>();
ref= FirebaseDatabase.getInstance().getReference();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.d("symbol", "executing? ");
if(dataSnapshot.exists()){
for (DataSnapshot ds : dataSnapshot.getChildren()){
Symbol s =ds.getValue(Symbol.class);
Log.d("symbol", s.getSymbol());
Log.d("symbol", s.getCompanyName());
list.add(s);
}
madapter= new SymbolAdapter(list);
recyclerView.setAdapter(madapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
当我运行时,我放入 addValueEventListener 的所有日志都没有到达。 是因为与firebase的连接吗?我将我的数据库规则设置为 true 以进行读取。 我加了 到 androidmanifest。 但是,它仍然不起作用。我检查了与
的连接DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
Log.d("symbol", "connected");
} else {
Log.d("symbol", "not connected");
}
}
然后 addValueEventListener 看起来到达 onDataChange 但即使我添加到清单也会打印“未连接”。
非常感谢
【问题讨论】:
-
检查 onCancelled 是否被调用? tyr 把日志放在 onCancelled
标签: android firebase firebase-realtime-database