iT邦幫忙

0

android studio BaseAdapter列出firebase資料問題

public class menu extends AppCompatActivity {
    private ListView LV;
    Context context = this;
    String name;
    DatabaseReference myRef3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);


        Bundle bundle = getIntent().getExtras();
         name = bundle.getString("key" );
        setTitle( name);
        LV=(ListView) findViewById(R.id.LV);
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef=database.getReference("menu");
        DatabaseReference myRef2=myRef.child("店家");
        myRef3=myRef2.child(name);
        MyAdapter mAdapter = new MyAdapter(context);//得到一個MyAdapter物件
        LV.setAdapter(mAdapter);//為ListView繫結Adapter

    }
    private ArrayList<HashMap<String, Object>> getData() {
        final ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
        myRef3.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    TextString user_data = ds.getValue(TextString.class);
                    HashMap<String, Object> map = new HashMap<String, Object>();
                    map.put("ItemTitle", user_data.getZ1());
                    map.put("ItemText", user_data.getZ2());
                    listItem.add(map);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        return listItem;
    }

private class MyAdapter extends BaseAdapter {
    private LayoutInflater mInflater;//得到一個LayoutInfalter物件用來匯入佈局

    /**建構函式*/
    public MyAdapter(Context context) {
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return getData().size();//返回陣列的長度
    }


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

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

    /**書中詳細解釋該方法*/
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        //觀察convertView隨ListView滾動情況
        Log.v("MyListViewBase", "getView " + position + " " + convertView);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.menu_item,null);
            holder = new ViewHolder();
            /**得到各個控制元件的物件*/
            holder.title = (TextView) convertView.findViewById(R.id.text1);
            holder.text = (TextView) convertView.findViewById(R.id.text2);
            holder.bt = (Button) convertView.findViewById(R.id.button);
            convertView.setTag(holder);//繫結ViewHolder物件
        }
        else{
            holder = (ViewHolder)convertView.getTag();//取出ViewHolder物件
        }
        /**設定TextView顯示的內容,即我們存放在動態陣列中的資料*/
        holder.title.setText(getData().get(position).get("ItemTitle").toString());
        holder.text.setText(getData().get(position).get("ItemText").toString());

        /**為Button新增點選事件*/
        holder.bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("MyListViewBase", "你點選了按鈕" + position);//列印Button的點選資訊
            }
        });

        return convertView;
    }

}

/**存放控制元件*/
public final class ViewHolder{
    public TextView title;
    public TextView text;
    public Button   bt;
}
}

我需要寫一個BaseAdapter來列出firebase裡的資料
可是不知道是哪個地方有問題都沒有辦法列出來
拜託各位大大幫我解答一下了感謝

tw_hsu iT邦新手 5 級 ‧ 2020-09-19 02:05:44 檢舉
仔細一看才發現

BaseAdapter不會自動更新資料
雖然你寫了getCount
但當你setAdapter的當下,getCount的長度是0,即使後來讀入資料然後存進ArrayList中,getCount並不會被觸發重新計算,始終都是0

要不是改變setAdapter的時間點
改成先取得資料然後再setAdapter

不然就要讓BaseAdapter有更新資料的能力
怎麼做我是不曉得
因為我都用ArrayAdapter
只要執行更新指令就好

2 個回答

1
小魚
iT邦大師 1 級 ‧ 2020-09-14 13:19:27

你可能要先學會分解問題,需求是寫一個BaseAdapter來列出firebase裡的資料,所以問題可能是出在

  1. 從firebase取得資料
  2. 分析取得的資料
  3. 將資料透過BaseAdapter顯示出來

可以從第一點開始測試,
在適當的地方記錄Log,
看看結果和自己想的有沒有一樣,
沒有一樣再去找原因或網路上搜尋答案.

0
tw_hsu
iT邦新手 5 級 ‧ 2020-09-19 02:06:08

仔細一看才發現

BaseAdapter不會自動更新資料
雖然你寫了getCount
但當你setAdapter的當下,getCount的長度是0,即使後來讀入資料然後存進ArrayList中,getCount並不會被觸發重新計算,始終都是0

要不是改變setAdapter的時間點
改成先取得資料然後再setAdapter

不然就要讓BaseAdapter有更新資料的能力
怎麼做我是不曉得
因為我都用ArrayAdapter
只要執行更新指令就好

我要發表回答

立即登入回答