我正在开发一个包含一个可扩展列表视图的Android应用程序,用于从Web服务加载数据,但我不想在启动时加载整个数据,而是先加载父列表,然后单击父列表,然后展开列表子项的特定列表项查看加载该特定项目的子项目,那么首先可以吗?
谢谢
最佳答案
我不确定您的问题是什么意思,但是如果您想要的是在BaseExpandableListAdapter中动态加载子项,例如当您单击相关的组标题(如下所示)时加载“子项”,我有解决方案。
v Group header 1 | -- Child item 1 | -- Child item 2 v Group header 2 | -- Child item 1 | -- Child item 2
In your Activity, find your ExpandableListView like this:
ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view);
然后添加一个侦听器以检查组单击:
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener()
{
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id)
{
if (expandableListView.isGroupExpanded(groupPosition))
expandableListView.collapseGroup(groupPosition);
else
new BackgroundTask(groupPosition).execute();
return true;
}
});
如果返回true,则将“消耗”该点击,并在您单击该组时停止默认扩展。这就是为什么在您的ASyncTask中,您需要手动对其进行扩展。如果返回false,则列表视图将在GUI中自动展开,直到折叠并重新展开组后,您才会看到后台计算的结果。
在我的代码中,我有一个SparseBooleanArray来跟踪是否已经为给定组设置了数据,然后在onGroupClick()方法中检查了该值。我这样做是为了使数据在组扩展时只需要加载一次,但是很显然,如果您希望在每次扩展中更改数据,则不希望这样做。您的问题相当模糊,因此我不确定您使用的确切情况是什么。
private class BackgroundTask extends AsyncTask<Void, Void, List<ReturnType>>
{
int groupPosition;
private BackgroundTask(int groupPosition)
{
this.groupPosition = groupPosition;
}
@Override
protected List<ReturnType> doInBackground(String... params)
{
// TODO: Do your background computation...
// Then return it
}
@Override
protected void onPostExecute(List<ReturnType> resultsList)
{
super.onPostExecute(resultsList);
// TODO: Add the resultsList to whatever structure you're using to store the data in the ListView Adapter
expandableListView.expandGroup(groupPosition);
}
}
我不确定这是否是最好的方法,但是它确实对我有用。
关于android - 如何在Android中的父项可展开 ListView 上动态添加onClick的子项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40447637/