我想获取 GridView 子项,我使用下面的代码,但它不起作用。
mAppGridAdapter = new gridadapter(mContext, appPackageInfos);
mAppManaGridView.setAdapter(mAppGridAdapter);
if(mAppManaGridView.getCount()>0)
{
mAppManaGridView.setSelection(0);
Log.d("adan", "adan>" + mAppManaGridView.getCount());
Log.d("adan", mAppManaGridView.getFirstVisiblePosition() + ", " +mAppManaGridView.getLastVisiblePosition());
for(int visiblePosition = mAppManaGridView.getFirstVisiblePosition(); visiblePosition <= mAppManaGridView.getLastVisiblePosition(); visiblePosition++) {
View item = mAppManaGridView.getChildAt(visiblePosition);
// make something
Log.d("adan", "adan>" + item.getWidth()+"," +item.getHeight() );
}
}
显示的调试日志消息,它可以获取子项计数,但无法获取 GridView 的任何子项:
D/adan (11457): adan>165
D/adan (11457): 0, -1
我也试过这段代码,但是返回项是null,它崩溃了nullPointerException。
if(mAppManaGridView.getCount()>0)
{
mAppManaGridView.setSelection(0);
Log.d("adan", "adan>" + mAppManaGridView.getCount());
View item = mAppManaGridView.getChildAt(0);
// make something
Log.d("adan", "adan>" + item.getWidth()+"," +item.getHeight() );
}
你能帮我解决这个问题吗?这让我很困扰。
getChildAt() 返回您的 GridView 的子视图。子视图位置和你的数据位置不一样,因为 AdapterViews 回收和重用子视图。这样,您可以在适配器中拥有 100 个数据项,而在 gridview 中只有 7 个子视图。
这是基础,您应该观看有关列表视图的谷歌 IO 视频(他们描述的内容主要针对所有 AdapterView)
我在所有片段回调方法中将 getChildCount() 设置为 0,将 getChildItem(i) 设置为 null。但是当我在网格视图上设置监听器时(即 onSetItemClickListener()),我将子项或 getChildrenCount 设置为非空。
如果你想让一个/多个子项成为默认项,那么在获取视图时(从getView())在网格视图适配器(实现基础适配器)中编写代码。您可以使用 Viewmodel 或接口进行通信(传递数据)。