ListView 未在选择微调项时填充
ListView is not populating on selecting the spinner item
我制作了两个微调器 - 一个用于选择城市,另一个用于选择 city.I 内的区域,我正在获取城市、区域和 ListView
的数据,以便在从Firebase 数据库。
我在自定义 ArrayAdapter
的帮助下填充 ListView
,它将数据存储在 ArrayList
中,后者将以 [=39] 的对象形式存储数据=] "vendorsInformation".
我的 java class 正在处理来自 Firebase 数据库的数据:
public class Location_Selection extends Fragment {
ArrayList<String> listVendorEmail=new ArrayList<>();
ArrayList<String> listVendorName=new ArrayList<>();
ArrayList<String> listVendorPhoneNo=new ArrayList<>();
ArrayList<vendorsInfomation> list_All_info_vendor=new ArrayList<>();
String categorySelected;
String citySelected;
String areaSelected;
public Location_Selection(String categorySelected)
{
this.categorySelected= categorySelected;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.city_selection_page,container,false);
final Spinner areaSelector=(Spinner)view.findViewById(R.id.select_area);
final Spinner selectCity=(Spinner)view.findViewById(R.id.selectCity);
ListView listView = (ListView) view.findViewById(R.id.displayAllAstrologers);
final displayingListAfterAreas listOfVendorsAdapter=new displayingListAfterAreas(getContext(),0,list_All_info_vendor);
listView.setAdapter(listOfVendorsAdapter);
selectCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, final View view, int position, long id) {
citySelected = selectCity.getSelectedItem().toString();
final ArrayList<String> listAreas = new ArrayList<String>();
String selectedCity = parent.getItemAtPosition(position).toString();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference = database.getReference(selectedCity);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String areaId = child.getKey().toString();
String areaName = child.getValue().toString();
listAreas.add(areaName);
}
}
ArrayAdapter<String> adapter = new ArrayAdapter(view.getContext(),
android.R.layout.simple_spinner_item, listAreas);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
areaSelector.setAdapter(adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
areaSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
areaSelected=areaSelector.getSelectedItem().toString();
listVendorEmail.clear();
listVendorPhoneNo.clear();
listVendorName.clear();
FirebaseDatabase database1 = FirebaseDatabase.getInstance();
DatabaseReference referenceForEmail = database1.getReference(categorySelected + "-" + citySelected + "-" + areaSelected + "/email");
referenceForEmail.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String getEmailNo = child.getKey().toString();
String getEmailId = child.getValue().toString();
listVendorEmail.add(getEmailId);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference referenceForName=database1.getReference(categorySelected + "-" + citySelected + "-" + areaSelected + "/name");
referenceForName.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String getNameId = child.getKey().toString();
String getName = child.getValue().toString();
listVendorName.add(getName);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference referenceForPhoneNo=database1.getReference(categorySelected+"-"+citySelected+"-"+areaSelected+"/phoneNo");
referenceForPhoneNo.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChildren())
{
for(DataSnapshot child: dataSnapshot.getChildren())
{
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return view;
}
}
我的自定义适配器class如下:
public class displayingListAfterAreas extends ArrayAdapter<vendorsInfomation> {
Context context;
ArrayList<vendorsInfomation> listDisplayingVendors;
public displayingListAfterAreas(Context context, int resource, ArrayList<vendorsInfomation> objects) {
super(context, resource, objects);
this.context=context;
listDisplayingVendors=objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v;
if (convertView == null) {
v = inflater.inflate(R.layout.format_of_list_of_categories, null);
} else {
v = convertView;
}
ImageView image_of_customer=(ImageView)v.findViewById(R.id.image_of_customer);
TextView name_of_customer=(TextView)v.findViewById(R.id.name_of_customer);
TextView email_of_customer=(TextView)v.findViewById(R.id.email_id_of_customer);
TextView phone_of_customer=(TextView)v.findViewById(R.id.phone_no_of_customer);
image_of_customer.setImageResource(R.drawable.customer_photo);
name_of_customer.setText(listDisplayingVendors.get(position).getVendorName());
email_of_customer.setText(listDisplayingVendors.get(position).getVendorEmailId());
phone_of_customer.setText(listDisplayingVendors.get(position).getVendorPhoneNo());
return v;
}
}
我的vendorsInformation.javaclass对象存储在ArrayList中的形式是:
public class vendorsInfomation {
String vendorName;
String vendorEmailId;
String vendorPhoneNo;
public vendorsInfomation(String vendorName,String vendorEmailId,String vendorPhoneNo)
{
this.vendorName=vendorName;
this.vendorEmailId=vendorEmailId;
this.vendorPhoneNo=vendorPhoneNo;
}
public String getVendorName() {
return vendorName;
}
public String getVendorEmailId() {
return vendorEmailId;
}
public String getVendorPhoneNo() {
return vendorPhoneNo;
}
public void setVendorName(String vendorName) {
this.vendorName = vendorName;
}
public void setVendorEmailId(String vendorEmailId) {
this.vendorEmailId = vendorEmailId;
}
public void setVendorPhoneNo(String vendorPhoneNo) {
this.vendorPhoneNo = vendorPhoneNo;
}
}
我没有在视图中填充 ListView
,并且在调试流程时没有进入此 for 循环。
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
因此 list_All_info_vendor
ArrayList
中没有项目。
因为 Firebase
使用异步任务。当您执行 for
循环时,您的 List
可能是空的,因此它没有进入 For
循环。您需要将该循环移动到 onDataChange
方法中。
DatabaseReference referenceForPhoneNo=database1.getReference(categorySelected+"-"+citySelected+"-"+areaSelected+"/phoneNo");
referenceForPhoneNo.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChildren())
{
for(DataSnapshot child: dataSnapshot.getChildren())
{
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
}
// Move this inside onDataChange.
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
在 Firebase 方法完成之前,您的所有列表都是空的。
如果您需要一个适配器来响应该数据,那么您需要在数据确实存在的地方设置适配器。
例如
for(DataSnapshot child: dataSnapshot.getChildren()) {
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
for(int i=0;i<listVendorPhoneNo.size();i++) {
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
但是,理想情况下,您应该重组数据库,以便可以从单个数据库引用中获取每条信息,因为您可能无法保证订购 listVendorName.get(i)
和 listVendorEmail.get(i)
对应于相同的数据,或者这些列表的长度相同,因此您最终可能会遇到索引越界异常,因为您只是在 phone 数字
的长度上循环
我制作了两个微调器 - 一个用于选择城市,另一个用于选择 city.I 内的区域,我正在获取城市、区域和 ListView
的数据,以便在从Firebase 数据库。
我在自定义 ArrayAdapter
的帮助下填充 ListView
,它将数据存储在 ArrayList
中,后者将以 [=39] 的对象形式存储数据=] "vendorsInformation".
我的 java class 正在处理来自 Firebase 数据库的数据:
public class Location_Selection extends Fragment {
ArrayList<String> listVendorEmail=new ArrayList<>();
ArrayList<String> listVendorName=new ArrayList<>();
ArrayList<String> listVendorPhoneNo=new ArrayList<>();
ArrayList<vendorsInfomation> list_All_info_vendor=new ArrayList<>();
String categorySelected;
String citySelected;
String areaSelected;
public Location_Selection(String categorySelected)
{
this.categorySelected= categorySelected;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.city_selection_page,container,false);
final Spinner areaSelector=(Spinner)view.findViewById(R.id.select_area);
final Spinner selectCity=(Spinner)view.findViewById(R.id.selectCity);
ListView listView = (ListView) view.findViewById(R.id.displayAllAstrologers);
final displayingListAfterAreas listOfVendorsAdapter=new displayingListAfterAreas(getContext(),0,list_All_info_vendor);
listView.setAdapter(listOfVendorsAdapter);
selectCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, final View view, int position, long id) {
citySelected = selectCity.getSelectedItem().toString();
final ArrayList<String> listAreas = new ArrayList<String>();
String selectedCity = parent.getItemAtPosition(position).toString();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference = database.getReference(selectedCity);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String areaId = child.getKey().toString();
String areaName = child.getValue().toString();
listAreas.add(areaName);
}
}
ArrayAdapter<String> adapter = new ArrayAdapter(view.getContext(),
android.R.layout.simple_spinner_item, listAreas);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
areaSelector.setAdapter(adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
areaSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
areaSelected=areaSelector.getSelectedItem().toString();
listVendorEmail.clear();
listVendorPhoneNo.clear();
listVendorName.clear();
FirebaseDatabase database1 = FirebaseDatabase.getInstance();
DatabaseReference referenceForEmail = database1.getReference(categorySelected + "-" + citySelected + "-" + areaSelected + "/email");
referenceForEmail.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String getEmailNo = child.getKey().toString();
String getEmailId = child.getValue().toString();
listVendorEmail.add(getEmailId);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference referenceForName=database1.getReference(categorySelected + "-" + citySelected + "-" + areaSelected + "/name");
referenceForName.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String getNameId = child.getKey().toString();
String getName = child.getValue().toString();
listVendorName.add(getName);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference referenceForPhoneNo=database1.getReference(categorySelected+"-"+citySelected+"-"+areaSelected+"/phoneNo");
referenceForPhoneNo.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChildren())
{
for(DataSnapshot child: dataSnapshot.getChildren())
{
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return view;
}
}
我的自定义适配器class如下:
public class displayingListAfterAreas extends ArrayAdapter<vendorsInfomation> {
Context context;
ArrayList<vendorsInfomation> listDisplayingVendors;
public displayingListAfterAreas(Context context, int resource, ArrayList<vendorsInfomation> objects) {
super(context, resource, objects);
this.context=context;
listDisplayingVendors=objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v;
if (convertView == null) {
v = inflater.inflate(R.layout.format_of_list_of_categories, null);
} else {
v = convertView;
}
ImageView image_of_customer=(ImageView)v.findViewById(R.id.image_of_customer);
TextView name_of_customer=(TextView)v.findViewById(R.id.name_of_customer);
TextView email_of_customer=(TextView)v.findViewById(R.id.email_id_of_customer);
TextView phone_of_customer=(TextView)v.findViewById(R.id.phone_no_of_customer);
image_of_customer.setImageResource(R.drawable.customer_photo);
name_of_customer.setText(listDisplayingVendors.get(position).getVendorName());
email_of_customer.setText(listDisplayingVendors.get(position).getVendorEmailId());
phone_of_customer.setText(listDisplayingVendors.get(position).getVendorPhoneNo());
return v;
}
}
我的vendorsInformation.javaclass对象存储在ArrayList中的形式是:
public class vendorsInfomation {
String vendorName;
String vendorEmailId;
String vendorPhoneNo;
public vendorsInfomation(String vendorName,String vendorEmailId,String vendorPhoneNo)
{
this.vendorName=vendorName;
this.vendorEmailId=vendorEmailId;
this.vendorPhoneNo=vendorPhoneNo;
}
public String getVendorName() {
return vendorName;
}
public String getVendorEmailId() {
return vendorEmailId;
}
public String getVendorPhoneNo() {
return vendorPhoneNo;
}
public void setVendorName(String vendorName) {
this.vendorName = vendorName;
}
public void setVendorEmailId(String vendorEmailId) {
this.vendorEmailId = vendorEmailId;
}
public void setVendorPhoneNo(String vendorPhoneNo) {
this.vendorPhoneNo = vendorPhoneNo;
}
}
我没有在视图中填充 ListView
,并且在调试流程时没有进入此 for 循环。
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
因此 list_All_info_vendor
ArrayList
中没有项目。
因为 Firebase
使用异步任务。当您执行 for
循环时,您的 List
可能是空的,因此它没有进入 For
循环。您需要将该循环移动到 onDataChange
方法中。
DatabaseReference referenceForPhoneNo=database1.getReference(categorySelected+"-"+citySelected+"-"+areaSelected+"/phoneNo");
referenceForPhoneNo.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChildren())
{
for(DataSnapshot child: dataSnapshot.getChildren())
{
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
}
// Move this inside onDataChange.
for(int i=0;i<listVendorPhoneNo.size();i++)
{
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
在 Firebase 方法完成之前,您的所有列表都是空的。
如果您需要一个适配器来响应该数据,那么您需要在数据确实存在的地方设置适配器。
例如
for(DataSnapshot child: dataSnapshot.getChildren()) {
String getPhoneNoId=child.getKey().toString();
String getPhoneNo=child.getValue().toString();
listVendorPhoneNo.add(getPhoneNo);
}
for(int i=0;i<listVendorPhoneNo.size();i++) {
vendorsInfomation newObjectToStore=new vendorsInfomation(listVendorName.get(i),listVendorEmail.get(i),listVendorPhoneNo.get(i));
list_All_info_vendor.add(newObjectToStore);
}
listOfVendorsAdapter.notifyDataSetChanged();
但是,理想情况下,您应该重组数据库,以便可以从单个数据库引用中获取每条信息,因为您可能无法保证订购 listVendorName.get(i)
和 listVendorEmail.get(i)
对应于相同的数据,或者这些列表的长度相同,因此您最终可能会遇到索引越界异常,因为您只是在 phone 数字