【问题标题】:How can i read data of outh user in firebase database?如何在 firebase 数据库中读取 outth 用户的数据?
【发布时间】:2017-11-06 08:31:07
【问题描述】:

我正在构建一个 android 应用程序,当用户以技术人员的身份创建其帐户时,他的姓名 ID 显示在 listview 中,其中其他用户没有 firebaseouth。问题是我无法在listview中显示技术人员的数据。

这是我的firebase 数据库

这是我的代码,它返回 0 个项目或空白 listview。我尝试了几件事,但无法显示技术人员的信息。任何人都请帮我解决这个问题,我是firebase 的新手。

    public class Technician extends Activity {

    ListView listView;
    ArrayList<String> tecnames = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_technician);

        ImageButton Back_Btn = (ImageButton) findViewById(R.id.back);
        Back_Btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(Technician.this, Technician_main.class);
                startActivity(i);
                finish();
            }
        });

        listView = (ListView) findViewById(R.id.list_item);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {


                Intent intent = new Intent(Technician.this, Book_Now.class);
                startActivity(intent);
                finish();
            }
        });

        Technician.CostumAdapter costumAdapter = new Technician.CostumAdapter();
        listView.setAdapter(costumAdapter);
        GetItems();
    }

    private class CostumAdapter extends BaseAdapter {


        @Override
        public int getCount() {
            return tecnames.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            view = getLayoutInflater().inflate(R.layout.cuctom_listview, null);

            TextView txt_one = (TextView) view.findViewById(R.id.skill_txt);
            txt_one.setText(tecnames.get(i));
            return view;
        }

    }

    private void GetItems() {
        DatabaseReference database = FirebaseDatabase.getInstance().getReference();
        DatabaseReference ref = database.child("user");
        final Query itemsQuery = ref.orderByChild("name");

        itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                        Pojo item = singleSnapshot.getValue(Pojo.class);
                        tecnames.add(String.valueOf(item));
                        Log.e(TAG,"value of name"+itemsQuery);
                    }
                }else {
                    Toast.makeText(getApplicationContext(),"error",Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        Log.e(TAG, "Returning " + tecnames.size() + " items");

    }
}

【问题讨论】:

  • 您是否尝试通知适配器您的 firebase 事件侦听器中的数据更改。
  • 您也在适配器的 getItem 中返回 null。您在 firebase 监听器中的日志语句是否打印?
  • 是的,我想是的..
  • 其实我不知道你能指导我什么问题
  • @Shruti 将取消删除:p

标签: android listview firebase firebase-realtime-database


【解决方案1】:

而不是这个:

  Technician.CostumAdapter costumAdapter = new Technician.CostumAdapter();

这样写:

 Technician.CostumAdapter costumAdapter = new Technician.CostumAdapter(getApplicationContext(),tecnames);

然后在类中添加这个构造函数:

private ArrayList<String> datas;
Context mContext;
public CustomAdapter(Context context, ArrayList<String> datas) {
    super(context, R.layout.row_item, datas);
    this.mContext=context;
    this.datas = datas;

}

addListenerforSingleValueEvent 更改为addValueEventListener

【讨论】:

  • 数据@Ehtishamhabib
  • 我不知道,但我无法解决这个问题 Context mContext;公共 CostumAdapter(上下文上下文,ArrayList 数据){ 超级(上下文,R.layout.activity_technician,数据); this.mContext=上下文; this.data = 数据;
  • 我收到错误 { super(context, R.layout.activity_technician, datas);
  • @Ehtishamhabib R.layout.cuctom_listview,您的列表项布局的 ID 不是活动
  • 你能帮我一个忙,把你的 Skype id 给我,这样我就可以和你分享我的代码了
【解决方案2】:

好的,您需要解决的问题很少:

1.您的数组列表 tecnames 应该属于您的 POJO 类

ArrayList&lt;POJO&gt; tecnames = new ArrayList&lt;&gt;();

现在将tecnames.add(String.valueOf(item)); 更改为tecnames.add(item);

2.正如@Peter Haddad 建议的那样,您需要将此列表作为数据集提供给您的适配器。

3.Firebase DB 侦听器是异步的,因此您需要在获取数据集(列表)中的数据后通知您的适配器。在你的 foreach 循环之后在 onDataChange 中添加以下代码:

costumAdapter.notifyDataSetChanged();

第三点可以参考this link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2021-07-18
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多