Android - GridView setSelection不起作用

时间:2014-08-12 17:00:47

标签: java android gridview android-viewpager selection

目前正在使用带有此项目片段设置的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());
}

除了未选择视图这一事实外,所有这一切都没有问题。此外,当我getSelectedItemPosition它返回-1 ...即使我只是'选择'位置16.任何想法都将非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

为了实现这个目的,我使用了Handler和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);
   }

如果有人有更好的解决方案,请告诉我。谢谢!

答案 1 :(得分:0)

您只能在绘制List / GridView后更新列表滚动位置。这在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);
        }
    }
});