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

时间:2017-04-28 19:22:35

标签: android firebase-realtime-database

我正在尝试从Firebase检索数据并在列表视图中显示。我可以从Firebase获取数据,但是当它显示在列表视图中时,它就会显示出来 com.example.Owner.carlocation.CarLocation@..表示检索的项目数量。我有5条记录带着拉特隆回来。我希望lat lon显示在每行记录的一行上。任何人都可以看到我出错的地方

我的FireBase结构为FireBase Structure

我的班级

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;
} 

}

这是我的代码

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) {

        }
    });
  }
}

更新

我的新适配器

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;
}

我的新活动

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) {

        }
    });

}

}

1 个答案:

答案 0 :(得分:1)

顺便说一句,您应该考虑使用FirebaseUI库。

因为你扩展了一个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<>();
}

除非您将XML文件命名为activity_listview,否则您的getView不应该对整个Activity布局进行充气,如果它不是一个令人困惑的名称,如果它实际上不是一个活动布局< / p>

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;
}