【问题标题】:Android Studio AddValueEventListener doesnt workAndroid Studio AddValueEventListener 不起作用
【发布时间】: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


【解决方案1】:

如果not connected 是从.info/connected 上的侦听器打印的,则意味着您的应用未连接到 Firebase 数据库服务器。既然是这种情况,您的其他处理程序将无法从服务器获取任何数据,并且它们的onDataChange 不会触发。

要解决此问题,您需要弄清楚 Firebase 客户端无法连接到服务器的原因。这通常是您的设备/模拟器上的互联网连接,或者您的客户端和服务器之间的阻塞流量。如果原因从 logcat 输出中不明显,请考虑在 Firebase 客户端中查看 enabling debug logging 以查看其详细输出。

【讨论】:

  • 好像我打开android studio的时候是连接的,几分钟后就断开了
  • Firebase 客户端会在几分钟左右自动关闭连接如果没有活动的侦听器并且没有发生写入时间。只要有活动的侦听器或写入,Firebase 客户端就不会关闭连接。 Android 可能,但我只看到它在应用程序没有被积极使用时才会这样做。
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多