Java Android-GridView无法运行

Java Android-GridView无法运行,java,android,gridview,android-viewpager,selection,Java,Android,Gridview,Android Viewpager,Selection,当前正在使用tabbar/viewpager,并为此项目设置了片段。片段2包含一个gridview。在应用程序启动时,默认情况下我会尝试选择一个gridview单元格,但无论我做什么,它都不会“选择”。我开始怀疑这是否是因为在尝试进行选择时,gridview已脱离屏幕(viewpager的第2页/片段) 我所做的是在GridViewAdapter的getView方法最初完成之后(我将位置与可能的单元格总数进行比较以确定这一点),我触发一条侦听器消息以选择GridView中的默认单元格。我这样做是

当前正在使用tabbar/viewpager,并为此项目设置了片段。片段2包含一个gridview。在应用程序启动时,默认情况下我会尝试选择一个gridview单元格,但无论我做什么,它都不会“选择”。我开始怀疑这是否是因为在尝试进行选择时,gridview已脱离屏幕(viewpager的第2页/片段)

我所做的是在GridViewAdapter的getView方法最初完成之后(我将位置与可能的单元格总数进行比较以确定这一点),我触发一条侦听器消息以选择GridView中的默认单元格。我这样做是为了(a)确保我尝试选择的单元格不为空,以及(b)我想知道getView方法是否以某种方式重置了选择

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;

    // * Other code that sets up the view

    if (listener!=null) {
        if ((list.size()-1)==position) {
            Log.d(TAG, "Today position set: " + todayPosition);
            listener.todayPositionFound(todayPosition);
        }
    } else {
        Log.d(TAG, "LISTENER IS NULL");
    }

    return row;
}
然后

public void todayPositionFound(final int position) {
    // * ------------------------
    // * On startup, select today
    // * ------------------------
    mCurrentlySelectedDate = DateHelper.todayAsString();
    Log.d(TAG, "Todays Position Found: " + position);
    View v = calendarView.getChildAt(position);
    if (v!=null) {
        Log.d(TAG, "V not NULL - SELECTING");
        v.setSelected(true);
    }

    Log.d(TAG, "SELECTED? " + calendarView.getSelectedItemPosition());
}

除了视图未被选中之外,所有这些都不会出现问题。此外,当我获取SelectedItemPosition时,它返回-1。。。尽管我刚刚“选择”了16号位置。如果您对此有任何想法,我们将不胜感激。谢谢大家!

为了让它工作,我使用了一个处理程序和Runnable:

    public void todayPositionFound(final int position) {
        Handler h = new Handler();
        Runnable r =new Runnable() {
            public void run() {
                View v = calendarView.getChildAt(position);
                if (v!=null) {
                    v.setSelected(true);
                }
            }
        };
        h.postDelayed(r, 500);
   }

如果有人有更好的解决方案,请务必让我知道。谢谢

只能在绘制列表/网格视图后更新列表滚动位置。调用
onCreate()
onResume()
onCreateView()
后不久就会发生这种情况

您可以尝试使用全局布局侦听器在绘制GridView时告诉您,例如:

GridView calendarView = (GridView)findViewById(R.id.YOUR_VIEW_ID);
ViewTreeObserver viewTreeObserver = calendarView.getViewTreeObserver(); 
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        this.calendarView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        View v = calendarView.getChildAt(position);

        if (v!=null) {
            v.setSelected(true);
        }
    }
});

进一步信息:如果我获取TodayPositionFind方法和findViewById返回的视图,并获取该视图中的TextView,我可以成功选择该TextView,包括由于选择而导致的UI更改。但这不是我想要的。。。因此,我不完全确定选择包含视图而不是子文本视图有什么不对……我还发现,如果我通过onClick在GridView中选择一个单元格,它就可以正常工作。我猜这里有什么东西正在重置选择。。。我可能错了,但这是我最好的假设。好吧,我的猜测是正确的。如果我延迟选择5秒,它会按预期发生。。。在初始应用程序启动时发生的某些情况正在清除所选内容。