我正在尝试从Firebase检索数据并在列表视图中显示。我可以从Firebase获取数据,但是当它显示在列表视图中时,它就会显示出来
com.example.Owner.carlocation.CarLocation@..
表示检索的项目数量。我有5条记录带着拉特隆回来。我希望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;
}
}
这是我的代码
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) {
}
});
}
}
答案 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;
}