我正在开发一个Android应用程序,其中包含一个可扩展列表视图,用于从Web服务加载数据,但我不想在启动时加载整个数据,但首先加载父列表然后单击父列表展开特定列表项列表视图的子项首先加载特定项目的子项目是否可能?
谢谢
答案 0 :(得分:1)
我不完全确定你的问题意味着什么,但如果你想要的是在BaseExpandableListAdapter中动态加载子项,例如单击相关组标题时加载“子项”(如下所示),我有一个解决方案。
v Group header 1 | -- Child item 1 | -- Child item 2 v Group header 2 | -- Child item 1 | -- Child item 2
在您的Activity中,找到您的ExpandableListView:
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);
}
}
我不确定这是否是最佳方式,但它确实对我有用。
答案 1 :(得分:0)
我需要知道api的样子。无论这个&#34;父母&#34;数据是,可能来自某些api?你能找回这个&#34;孩子&#34;来自另一个api电话的数据?
可以采取的一种方式是:
需要注意的事项
请记住,绑定到UI时,您应该采用某种策略。这个清单有多大?它需要分页吗?你将如何处理这个分页?你如何/在哪里缓存你的物品清单?应该是什么样的用户体验?
这些都是事情,还有更多,要考虑。
你应该考虑的一些事情是改造/ okhttp,sqlite / realm,Picasso(如果你想扩展图像),CursorAdapter(分页)。