目前正在使用带有此项目片段设置的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.任何想法都将非常感激。谢谢!
答案 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);
}
}
});