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裡的資料
可是不知道是哪個地方有問題都沒有辦法列出來
拜託各位大大幫我解答一下了感謝
你可能要先學會分解問題,需求是寫一個BaseAdapter來列出firebase裡的資料,所以問題可能是出在
可以從第一點開始測試,
在適當的地方記錄Log,
看看結果和自己想的有沒有一樣,
沒有一樣再去找原因或網路上搜尋答案.
仔細一看才發現
BaseAdapter不會自動更新資料
雖然你寫了getCount
但當你setAdapter的當下,getCount的長度是0,即使後來讀入資料然後存進ArrayList中,getCount並不會被觸發重新計算,始終都是0
要不是改變setAdapter的時間點
改成先取得資料然後再setAdapter
不然就要讓BaseAdapter有更新資料的能力
怎麼做我是不曉得
因為我都用ArrayAdapter
只要執行更新指令就好