解决在ListView

时间:2016-03-15 15:23:48

标签: android listview

我发现自己有一天会看到一个平板电脑优化的设计,左侧显示一个带有搜索结果的窗格,另一个显示右侧显示相应详细信息的窗格,这并不奇怪。左窗格中的结果具有选定状态,以指示当前显示的详细信息。在公园散步似乎最终成了一次无聊的错误之旅。但最后我设法让它工作,我删除了所有不相关的测试代码,只是发现它已经停止工作了。我重新引入了“不相关”的部分,令人惊讶的是它按计划运作。

客户满意,设计师很高兴,但不是我,因为我仍然不明白为什么它会起作用。

  1. 我有一个片段,其中的ListView的choiceMode设置为 ListView.CHOICE_MODE_SINGLE
  2. 适配器为每个结果充气自定义视图,并将drawable设置为背景(在代码中发生)
  3. drawable是一个包含在RippleDrawable中的选择器,具有已检查已激活的状态,并且具有需要保留的所选状态的drawable。
  4. 自定义视图会覆盖 setSelected(布尔选择)并依赖布尔值添加或删除具有所选状态的视图。
  5. 现在我的问题是3& 4. 已选中已激活状态(步骤3)可确保在轻触视图时调用 setSelected(true),但不会立即调用一旦touchDown结束,使用 setSelected(false)再次调用,因此我在步骤4中设置的视图停留。

    我曾预料到我不需要步骤4中的自定义视图,因为我认为它会使用drawable来执行步骤3中的激活状态。从步骤4删除自定义(因此与Android状态系统无关)视图从步骤3中绘制的状态确实显示的效果,但仅在onPress(touchDown / Hold)期间和...在上一个选定项目上显示!

    项目背景

    <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
      android:color="@color/light_gray">
      <item android:drawable="@drawable/search_result_selector" />
    </ripple>
    

    选择器Drawable(search_result_selector)

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:drawable="@color/white_selected" android:state_selected="true"/>
      <item android:drawable="@color/white_selected" android:state_pressed="true"/>
      <item android:drawable="@drawable/search_result_highlighted_state" android:state_activated="true"/>
      <item android:drawable="@drawable/search_result_highlighted_state" android:state_checked="true"/>
      <item android:drawable="@color/white"/>
    </selector>
    
    用于ListView

    中的项目的自定义视图

    setSelected(已选择)

    @Override
    public void setSelected(boolean selected) {
        super.setSelected(selected);
    
        if (selected && selectedView == null) {
            selectedView = new View(getContext());
            selectedView.setBackground(Utils.getDrawable(getContext(), R.drawable.action_bar_background));
    
            RelativeLayout.LayoutParams lp = new LayoutParams(Utils.pxFromDp(getContext(), 3), getHeight());
            lp.addRule(ALIGN_PARENT_RIGHT);
    
            addView(selectedView, lp);
        } else if (!selected && selectedView != null) {
            removeView(selectedView);
            selectedView = null;
        }
    }
    

    selectedView 是我在自定义视图类中定义的字段。我明白为什么它有效,但我想知道为什么我需要它,因为我期望正确使用状态drawable并保留选择。奇怪的是当我删除那部分时,ListView决定使用drawable,但是在之前选择的视图上并且仅在touchDown期间。现在为什么自定义实现的存在会影响Android视图状态的工作?显然它在某种程度上被捆绑在一起,但我看不到在哪里。任何关于这一切背后原因的指示都会让我放心。提前谢谢!

    修改 显然我的一个结论是错误的。即使选择器中有状态,也会调用 setSelected(false)。这也许是有意义的,如果激活是重要的状态。我将代码移动到setActivated上的覆盖方法,实际上显示了我的自定义视图。那说奇怪的是......国家的抽签不能按预期运作。

0 个答案:

没有答案