Android 从Firebase检索数据并显示在列表视图中

Android 从Firebase检索数据并显示在列表视图中,android,firebase-realtime-database,Android,Firebase Realtime Database,我正在尝试从Firebase检索数据并显示在列表视图中。我可以从Firebase获取数据,但当它显示在listview中时,它只是显示 com.example.Owner.carlocation。CarLocation@..获取检索到的项目数量。我有5张带着lat lon的唱片回来了。我希望lat lon在每条记录的一行上显示。谁能看出我错在哪里 我的火基结构是 我的班级 public class CarLocation { public String uid; public Double la

我正在尝试从Firebase检索数据并显示在列表视图中。我可以从Firebase获取数据,但当它显示在listview中时,它只是显示
com.example.Owner.carlocation。CarLocation@..
获取检索到的项目数量。我有5张带着lat lon的唱片回来了。我希望lat lon在每条记录的一行上显示。谁能看出我错在哪里

我的火基结构是

我的班级

public class CarLocation {
public String uid;
public Double lat;
public Double lon;

public CarLocation() {
    // Default constructor required for calls to DataSnapshot.getValue(Post.class)
}

public CarLocation(String uid, Double lat, Double lon) {
    this.uid = uid;
    this.lat = lat;
    this.lon = lon;

}

@Exclude
public Map<String, Object> toMap() {
    HashMap<String, Object> result = new HashMap<>();
    result.put("uid", uid);
    result.put("Lat", lat);
    result.put("Lon", lon);

    return result;
} 
公共类位置{
公共字符串uid;
公共双lat;
公共双龙;
公共场所(){
//调用DataSnapshot.getValue(Post.class)所需的默认构造函数
}
公共位置(字符串uid、双lat、双lon){
this.uid=uid;
this.lat=lat;
this.lon=lon;
}
@排除
公共地图toMap(){
HashMap结果=新建HashMap();
结果。输入(“uid”,uid);
结果。放置(“Lat”,Lat);
结果。放置(“Lon”,Lon);
返回结果;
} 
}

这是我的密码

public class HistoryActivity extends AppCompatActivity {

ListView mListView;
ArrayList<CarLocation> mMobileArray = new ArrayList<>();
ArrayAdapter<CarLocation> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);
    mListView = (ListView) findViewById(R.id.history);
    mAdapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,mMobileArray);
    mListView.setAdapter(mAdapter);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Location");



    reference.orderByChild("uid").limitToLast(5).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            CarLocation value =  dataSnapshot.getValue(CarLocation.class);


            mMobileArray.add(value);
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
  }
}
公共类HistoryActivity扩展了AppCompatActivity{
列表视图;
ArrayList mMobileArray=新的ArrayList();
ArrayAdapter mAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
mListView=(ListView)findViewById(R.id.history);
mAdapter=newarrayadapter(这是android.R.layout.simple\u dropdown\u item\u 1line,mMobileArray);
mListView.setAdapter(mAdapter);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
DatabaseReference=FirebaseDatabase.getInstance().getReference(“位置”);
reference.orderByChild(“uid”).limitToLast(5.addChildEventListener(新的ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
CarLocation value=dataSnapshot.getValue(CarLocation.class);
mMobileArray.add(值);
mAdapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
}
更新

我的新适配器

public class Adapter extends ArrayAdapter<CarLocation> {
private Activity mActivity;
private ArrayList<CarLocation> car;
private static LayoutInflater inflater = null;

public Adapter(Activity activity, int textViewResourceid, ArrayList<CarLocation> list) {
    super(activity, textViewResourceid, list);
    try {
        this.mActivity = activity;
        car = list;

        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    } catch (Exception e) {
    }

}

public  int getCount(){return car.size();}

public CarLocation getItem(CarLocation position){return  position;}

public long getItemId(int position){return position;}

public static class ViewHolder {
    public TextView display_name;


}

public View getView(int position, View convertView, ViewGroup parent){
    View vi = convertView;
    final ViewHolder holder;
    try{
        if (convertView == null){
            vi = inflater.inflate(R.layout.activity_listview, null);
            holder = new ViewHolder();

            holder.display_name = (TextView) vi.findViewById(R.id.label);

            vi.setTag(holder);

        }else{
            holder = (ViewHolder) vi.getTag();
        }
        holder.display_name.setText(mActivity.getString(R.string.coords,String.valueOf(car.get(position).getLat()),String.valueOf(car.get(position).getLon())));


    }catch (Exception e){

    }


    return vi;
}
公共类适配器扩展了ArrayAdapter{
私人活动能力;
私家车;
专用静态充气机=空;
公共适配器(活动、int-textViewResourceid、ArrayList列表){
超级(活动、textViewResourceid、列表);
试一试{
这个。活动=活动;
car=列表;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}捕获(例外e){
}
}
public int getCount(){return car.size();}
公共位置getItem(位置){返回位置;}
公共长getItemId(int位置){return position;}
公共静态类视图持有者{
公共文本视图显示名称;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
最终持票人;
试一试{
if(convertView==null){
vi=充气机充气(R.layout.activity_listview,null);
holder=新的ViewHolder();
holder.display_name=(TextView)vi.findViewById(R.id.label);
vi.setTag(支架);
}否则{
holder=(ViewHolder)vi.getTag();
}
holder.display_name.setText(mActivity.getString(R.string.coords,string.valueOf(car.get(position.getLat()),string.valueOf(car.get(position.getLon()));
}捕获(例外e){
}
返回vi;
}
我的新活动

public class HistoryActivity extends AppCompatActivity {

List<CarLocation> mCarLocationList;
List<String> mString;
ListView mListView;
Adapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    setContentView(R.layout.activity_history);
    mCarLocationList = new ArrayList<>();
    mString = new ArrayList<>();
    mListView = (ListView) findViewById(R.id.history);
    mAdapter = new Adapter(HistoryActivity.this,0, (ArrayList<CarLocation>)mCarLocationList);

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Location");
    mListView.setAdapter(mAdapter);

    reference.orderByChild("uid").limitToLast(5).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            CarLocation value =  dataSnapshot.getValue(CarLocation.class);
            mCarLocationList.add(value);
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}
公共类HistoryActivity扩展了AppCompatActivity{
列表mCarLocationList;
列出mString;
列表视图;
适配器马达;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
setContentView(R.layout.activity_history);
mCarLocationList=新建ArrayList();
mString=newarraylist();
mListView=(ListView)findViewById(R.id.history);
mAdapter=新适配器(HistoryActivity.this,0,(ArrayList)mCarLocationList);
DatabaseReference=FirebaseDatabase.getInstance().getReference(“位置”);
mListView.setAdapter(mAdapter);
reference.orderByChild(“uid”).limitToLast(5.addChildEventListener(新的ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
CarLocation value=dataSnapshot.getValue(CarLocation.class);
mCarLocationList.add(值);
mAdapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}

顺便说一下,你确实应该考虑使用FiasBasei库。

但是,由于扩展了ArrayAdapter,因此不需要实现这些功能

public CarLocation getItem(CarLocation position){return  position;}

public long getItemId(int position){return position;}
你应该在上下文中传递,而不是在活动中传递,我不知道你希望在那里看到什么

public Adapter(Context context, ArrayList<CarLocation> list) {
    super(context, 0, list);
    this.mContext = context;
    car = list;
    if (car == null) car = new ArrayList<>();
}
public View getView(int position, View convertView, ViewGroup parent){
    View vi = convertView;
    ViewHolder holder;
    final CarLocation item = car.get(position);

    if (convertView == null) {
        vi = LayoutInflater.from(mContext).inflate(R.layout.item_carlocation, null);
        holder = new ViewHolder();
        holder.display_name = (TextView) vi.findViewById(R.id.label);

        vi.setTag(holder);
    }else{
        holder = (ViewHolder) vi.getTag();
    }

    holder.display_name.setText(
        String.format("%.2f, %.2f",
             item.getLat(), item.getLon()));

    return vi;
}