如何为第一个操作正确地从数组列表中检索数据

Posted

技术标签:

【中文标题】如何为第一个操作正确地从数组列表中检索数据【英文标题】:How can I retrieve data from array list properly for the first action 【发布时间】:2021-05-15 22:03:45 【问题描述】:

数组列表中有 5 个项目。如果用户单击项目 1,程序将显示项目 1,如果用户单击项目 2,程序将显示项目 2,依此类推。问题是用户必须单击两次按钮才能进行首次操作,除非未从程序中检索数据。我不知道为什么。我不知道哪个部分导致了这个问题。如果您能指出问题的原因,我真的很乐意为您提供帮助。

这是我的代码

//start here to retrieve fav books
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Users")
        .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Wishlist");

myRef.addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) 
        List<String> wishlist_item = new ArrayList<String>();
        for (DataSnapshot postSnapshot: snapshot.getChildren()) 
            wishlist_item.add(postSnapshot.getValue().toString());
        
        //list 1
            L1.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View view) 
                    if(wishlist_item.size()>=1)
                        Intent launchWish = new Intent(wish_list.this, wishlist_webview.class);
                        String a = wishlist_item.get(0);
                        launchWish.putExtra("k",a);
                        startActivity(launchWish);
                        //animation
                        overridePendingTransition(R.anim.slide_up_in,R.anim.slide_up_out);
                    else
                        Toast.makeText(wish_list.this, "Favourite 1 is empty", Toast.LENGTH_SHORT).show();
                    
                
            );
        //list 2
        L2.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                if(wishlist_item.size()>=2)
                    Intent launchWish = new Intent(wish_list.this, wishlist_webview.class);
                    String b = wishlist_item.get(1);
                    launchWish.putExtra("k",b);
                    startActivity(launchWish);
                    //animation
                    overridePendingTransition(R.anim.slide_up_in,R.anim.slide_up_out);
                else
                    Toast.makeText(wish_list.this, "Favourite 2 is empty", Toast.LENGTH_SHORT).show();
                
            
        );
        //list 3
        L3.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                if(wishlist_item.size()>=3)
                    Intent launchWish = new Intent(wish_list.this, wishlist_webview.class);
                    String c = wishlist_item.get(2);
                    launchWish.putExtra("k",c);
                    startActivity(launchWish);
                    //animation
                    overridePendingTransition(R.anim.slide_up_in,R.anim.slide_up_out);
                else
                    Toast.makeText(wish_list.this, "Favourite 3 is empty", Toast.LENGTH_SHORT).show();
                
            
        );
        //list 4
        L4.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                if(wishlist_item.size()>=4)
                    Intent launchWish = new Intent(wish_list.this, wishlist_webview.class);
                    String d = wishlist_item.get(3);
                    launchWish.putExtra("k",d);
                    startActivity(launchWish);
                    //animation
                    overridePendingTransition(R.anim.slide_up_in,R.anim.slide_up_out);
                else
                    Toast.makeText(wish_list.this, "Favourite 4 is empty", Toast.LENGTH_SHORT).show();
                
            
        );
        //list 5
        L5.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                if(wishlist_item.size()>=5)
                    Intent launchWish = new Intent(wish_list.this, wishlist_webview.class);
                    String e = wishlist_item.get(4);
                    launchWish.putExtra("k",e);
                    startActivity(launchWish);
                    //animation
                    overridePendingTransition(R.anim.slide_up_in,R.anim.slide_up_out);
                else
                    Toast.makeText(wish_list.this, "Favourite 5 is empty", Toast.LENGTH_SHORT).show();
                
            
        );
    
    @Override
    public void onCancelled(@NonNull DatabaseError error) 
    
);

【问题讨论】:

您好,onClick 监听器是第一次触发吗? 第一次是什么意思?每当我打开此活动并单击 fav 1 或 2 或 3 或 4 或 5 时,我都必须单击该按钮两次。我必须首先单击该按钮,并且程序只能从第二次单击开始工作。 @akhilnair 【参考方案1】:

我想您需要在onDataChange 方法之外设置按钮的onClickListeners,因为只要数据发生变化,就会触发onDataChange。您还需要将List&lt;String&gt; wishlist_item 作为类的实例变量,并在每次数据更改时重新填充列表(取决于您的业务案例)

在当前的方法中,从服务器加载数据需要一些时间,一旦触发 onDataChange,然后设置按钮的侦听器,这可能是第一次单击时没有任何反应的原因.

【讨论】:

是的,你是对的,非常感谢你的帮助。我按照您所说的更改了流程,现在可以使用@akhil nair【参考方案2】:

我猜你在L1..L5 范围内的所有按钮默认都是visible,而FirebaseDatabase 调用是异步的,这意味着它正在从远程获取数据并且需要时间进行IO,因此需要一些时间才能获得响应,我最好的选择是通过最初隐藏按钮来显示某种LOADING 状态,当您将ClickListeners 设置为按钮时,将它们设为VISIBLE

【讨论】:

第一次点击什么都不显示。我认为这不是加载时间,因为即使我在等待任何响应,第一次点击尝试也没有发生任何事情。 @ranja.kali

以上是关于如何为第一个操作正确地从数组列表中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIViewController 的第一个视图提供带有乘数的垂直间距

如何为javascript数组中的每个对象动态添加属性

如何为 SwiftUI 列表中的各个行设置动画?

在 R Shiny 中,如何为反应对象渲染绘图?

如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

如何为登录屏幕页面编写 Jest 测试