【问题标题】:Android - GridView setSelection not workingAndroid - GridView setSelection 不起作用
【发布时间】:2014-08-12 17:00:46
【问题描述】:

目前正在为该项目使用带有片段设置的标签栏/视图分页器。片段 2 包含一个网格视图。在应用程序启动时,我试图默认选择一个 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 位。对此的任何想法都将不胜感激。谢谢!

【问题讨论】:

  • 更多信息:如果我采用 todayPositionFound 方法和 findViewById 返回的视图并在该视图中获取 TextView,我可以成功选择该 TextView,包括由于选择而导致的 UI 更改。但这不是我想要的......所以我不完全确定我在选择包含视图而不是子 TextView 时做错了什么......
  • 我还发现,如果我通过 onClick 在 GridView 中选择一个单元格,它就可以正常工作。我的猜测是某些东西正在重置选择...我可能是错的,但在这一点上这是我最好的假设。
  • 好的,我的猜测是正确的。如果我将选择延迟 5 秒,它会按预期发生......在初始应用启动时发生的事情正在清除选择。

标签: java android gridview android-viewpager selection


【解决方案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);
   }

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

【讨论】:

    【解决方案2】:

    您只能在绘制 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);
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多