如何解决使用Firebase中的数据创建ExpandableListView
我正在创建一个任务管理器应用程序。我在ExpandableListView
中显示这些任务时遇到了问题,因为每个任务都有子任务,所以我正在使用它。这是我的数据库结构:
。
ExpandableListView适配器可能工作良好。但是我在使用fillData()
方法从firebase读取数据时遇到了问题。
Activity
和ExpandableListView
:
public class Tasks extends AppCompatActivity {
ExpandableListView expandableListView;
Customexpandablelistadapter expandablelistadapter;
List<String> tasks;
Map<String,List<String>> subtasks;
private FirebaseDatabase firebasedatabase;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tasks);
BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
bottomNav.setSelectedItemId(R.id.tasks);
expandableListView = (ExpandableListView) findViewById(R.id.tasks_list);
firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
fillData();
expandablelistadapter = new Customexpandablelistadapter(this,tasks,subtasks);
expandableListView.setAdapter(expandablelistadapter);
bottomNav.setonNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.notes:
startActivity(new Intent(getApplicationContext(),Notes.class));
overridePendingTransition(0,0);
return true;
case R.id.tasks:
return true;
case R.id.goals:
startActivity(new Intent(getApplicationContext(),Goals.class));
overridePendingTransition(0,0);
return true;
case R.id.statistics:
startActivity(new Intent(getApplicationContext(),Statistics.class));
overridePendingTransition(0,0);
return true;
case R.id.add:
startActivity(new Intent(getApplicationContext(),Add.class));
overridePendingTransition(0,0);
return true;
}
return false;
}
});
}
public void fillData()
{
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(tasks.size() > 0) tasks.clear();
for(DataSnapshot ds : dataSnapshot.getChildren())
{
String taskName = (String) ds.child("Tasks").getValue();
tasks.add(taskName);
}
expandablelistadapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
ExpandableListView适配器:
public class Customexpandablelistadapter extends Baseexpandablelistadapter {
private Context context;
private List<String> listHeader;
private Map<String,List<String>> listChildren;
public Customexpandablelistadapter(Context context,List<String> listHeader,Map<String,List<String>> listChildren){
this.context = context;
this.listHeader = listHeader;
this.listChildren = listChildren;
}
@Override
public int getGroupCount() {
return this.listHeader.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return this.listChildren.get(listHeader.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return this.listHeader.get(groupPosition);
}
@Override
public Object getChild(int groupPosition,int childPosition) {
return this.listChildren.get(this.listHeader.get(groupPosition));
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition,int childPosition) {
return childPosition;
}
@Override
public boolean hasstableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition,boolean isExpanded,View convertView,ViewGroup parent) {
String header = (String) getGroup(groupPosition);
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_view_header,null);
}
TextView headerOfGroup = (TextView) convertView.findViewById(R.id.header_text);
headerOfGroup.setText(header);
return convertView;
}
@Override
public View getChildView(int groupPosition,int childPosition,boolean isLastChild,ViewGroup parent) {
String child = (String) getChild(groupPosition,childPosition);
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_view_child,null);
}
TextView childText = (TextView) convertView.findViewById(R.id.child_text);
childText.setText(child);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition,int childPosition) {
return true;
}
}
解决方法
据我所知,您问题中的相关代码为:
firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(tasks.size() > 0) tasks.clear();
for(DataSnapshot ds : dataSnapshot.getChildren())
{
String taskName = (String) ds.child("Tasks").getValue();
tasks.add(taskName);
}
expandableListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
您的代码将一个侦听器附加到/Tasks
,然后遍历其子节点,并获得每个子节点的Tasks
子节点。但是,如果我们查看您的数据库结构,则每个任务下都没有Tasks
子节点。这样一来,可能会为/Tasks
如果要显示/Tasks
的每个子节点的键(因此在屏幕截图中显示make a aolication
和Shoping
),则需要使用getKey()
每个子节点的数量:
firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(tasks.size() > 0) tasks.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String taskName = ds.getKey();
tasks.add(taskName);
}
expandableListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException()
}
});
如果要显示每个子节点的Subtasks
下的所有值,则需要为此添加另一个嵌套循环:
firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(tasks.size() > 0) tasks.clear();
for(DataSnapshot taskSnapshot: dataSnapshot.getChildren()) {
DataSnapshot subtasksSnapshot = taskSnapshot.child("Subtasks");
for(DataSnapshot subtaskSnapshot: subtasksSnapshot.getChildren()) {
String taskName = subtaskSnapshot.getValue(String.class);
tasks.add(taskName);
}
}
expandableListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException()
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。