首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法上访问arraylist

在方法上访问arraylist
EN

Stack Overflow用户
提问于 2017-09-28 17:39:29
回答 2查看 184关注 0票数 0

我是一个android开发的初学者,我遇到了arraylist.的问题,我声明arraylist城市为全局变量,并从firebase.But添加元素到其中。之后,当我在addchildevent监听器方法之外访问这些元素时,数组列表变成了empty.How我可以声明数组列表来获取全局元素吗?我的代码片段是,

代码语言:javascript
复制
public class BookingDetails extends Fragment {
private RecyclerView recyclerView;
private DatabaseReference dataRef;
private FirebaseAuth mAuth;
ArrayList<String> uids=new ArrayList<String>();
private ArrayList<String> dates=new ArrayList<>();
private int hour;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    InputMethodManager in=(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
    final View v=inflater.inflate(R.layout.activity_booking_details,container,false);
    recyclerView = (RecyclerView) v.findViewById(R.id.book_detail_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(llm);
    recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity()));
    mAuth=FirebaseAuth.getInstance();
    final String user=mAuth.getCurrentUser().getUid();

    dataRef= FirebaseDatabase.getInstance().getReference();
    dataRef.child("Users").child(user).child("booked docters").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot data:dataSnapshot.getChildren()) {
                uids.add(data.getKey());
            }
       }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    Toast.makeText(getActivity(),uids.get(0), Toast.LENGTH_SHORT).show();
    return v;
    }

}

当我在方法值上使用这个toast时,事件侦听器给出了正确的elements.How来解决这个问题,这就给了我empty.But。

EN

回答 2

Stack Overflow用户

发布于 2017-09-28 18:17:34

Firebase侦听器是异步的,因此请在Firebase侦听器中按如下方式填充数据后在其中使用arraylist:

代码语言:javascript
复制
ArrayList<String> itemList;

private void someFunction() {
    itemList = new ArrayList<>();
    someDatabaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : snapshot.getChildren()) {
                String item = child.getKey();
                itemList.add(item);
            }
            // Now your itemList is filled and ready to be used...
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    // If you try to use itemList here then you may get error since it is empty...
}
票数 0
EN

Stack Overflow用户

发布于 2017-09-28 21:43:42

Mehmed关于哪里出了问题的理由是正确的。您需要将需要访问uids 的代码移到的` `onDataChange方法中。这样做的一种方法是:

代码语言:javascript
复制
dataRef= FirebaseDatabase.getInstance().getReference();
dataRef.child("Users").child(user).child("booked docters").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot data:dataSnapshot.getChildren()) {
            uids.add(data.getKey());
        }
        Toast.makeText(getActivity(),uids.get(0), Toast.LENGTH_SHORT).show();
   }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46465854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档