Android中GridView多项选择器无法工作的问题

14
我想在长按后绘制选择器,如图所示。当我对一个项目进行长按时,CAB菜单会被激活。但是,列表选择器指示器在点击后就会消失。我希望列表选择器在CAB菜单处于活动状态时保持活动状态,以允许多个选择。如果我双击,颜色应该切换。当我单击时,此代码工作为闪烁。有人遇到过类似的问题吗? 有没有黑客方法来实现这个功能?
多选GridView: enter image description here 在我的OnCreate中设置GridView选择:
gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
gridView.setMultiChoiceModeListener(new MultiChoiceModeListener());

这个运行良好:

gridView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View v,
            int position, long id) {

    ImageView iv = (ImageView) v
                        .findViewById(R.id.imageview2);
                ViewGroup gridChild = (ViewGroup) gridView
                        .getChildAt(position);
                ViewGroup gridGrandChild = (ViewGroup) gridChild
                        .getChildAt(0);
                ViewGroup gridGreatGrandChild = (ViewGroup) gridGrandChild
                        .getChildAt(0);
                int childSize = gridGreatGrandChild.getChildCount();
                if (iv.getId() == gridGreatGrandChild.getChildAt(1)
                        .getId()) {
                    if (iv.getVisibility() == 4)
                        iv.setVisibility(View.VISIBLE);
                    else
                        iv.setVisibility(View.INVISIBLE);
                }
}});

在CAB菜单被激活后,我正在尝试将相同的代码实现在MultiChoiceModeListener()类中。将相同的代码复制到其中。

public void onItemCheckedStateChanged(ActionMode mode, int position,
            long id, boolean checked) {
}

方法。但我无法访问视图组内的元素。但我能够整体访问GridView。但无法访问Grid中的单个子项。

这是我的GridView布局:

    <GridView
            android:id="@+id/grid_view"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:columnWidth="190dp"
            android:drawSelectorOnTop="true"
            android:choiceMode="multipleChoice"
            android:horizontalSpacing="3dp"
            android:listSelector="@drawable/list_selector"
            android:numColumns="auto_fit"
            android:paddingRight="4dp"
            android:stretchMode="spacingWidthUniform"
            android:verticalSpacing="3dp" >
        </GridView>

GridView中的每个项都使用此布局构建:

<FrameLayout
    android:id="@+id/frameLayout1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:id="@+id/relativelayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/imageview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </ImageView>

        <ImageView
            android:id="@+id/imageview2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/imageview"
            android:layout_alignLeft="@+id/imageview"
            android:layout_alignRight="@+id/imageview"
            android:layout_alignTop="@+id/imageview"   
            android:visibility="invisible"
             android:background="#76f9a49c"            
             >
        </ImageView>
    </RelativeLayout>

    <ImageView
        android:id="@+id/tagimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|right"
        android:layout_marginRight="-4dp"
        android:src="@drawable/tag"
        android:visibility="invisible" />

    <ImageView
        android:id="@+id/countimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="8dp"
        android:layout_marginRight="5dp"
        android:src="@drawable/dealcount_overlay"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="11dp"
        android:layout_marginRight="24dp"
        android:text="100"
        android:textColor="#fff"
        android:visibility="invisible" >
    </TextView>

    <ProgressBar
        android:id="@+id/progressbar"
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_gravity="center"
        android:visibility="visible" />
</FrameLayout>

<TextView
    android:id="@+id/textView_nodata"
    android:layout_width="wrap_content"
    android:layout_height="150dp"
    android:layout_below="@+id/frameLayout1"
    android:layout_centerHorizontal="true"
    android:text="No data available. Try different query!"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:visibility="gone" />

</RelativeLayout>

这是我的list_selector.xml文件:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@color/gridviewlistselector" android:state_focused="true" android:state_pressed="false"/>
<item android:state_focused="true"><shape>
        <solid android:color="#66000000" />
    </shape></item>
<item android:state_selected="true"><shape>
        <solid android:color="#66000000" />
    </shape></item>
<item android:state_pressed="true"><shape>
        <solid android:color="#66000000" />
    </shape></item>
<item android:state_enabled="false" android:state_focused="true"><shape>
        <solid android:color="#66000000" />
    </shape></item>

</selector>

我该如何实现这个功能?我卡在这里了。我尝试了各种不同的选择器组合,但是似乎都不起作用。我需要提供其他详细信息吗?

5个回答

1

我不确定这是否是正确的解决方案,但我在我的列表项上设置了android:background

<selector xmlns:android="http://schemas.android.com/apk/res/android"
        android:exitFadeDuration="@android:integer/config_mediumAnimTime" >

    <!-- I never see this one - the grid items are not focusable -->
    <item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/list_focused" />

    <!-- while pressed -->
    <item android:state_pressed="true" android:drawable="@drawable/pressed_background" />

    <!-- while selected in actionmode -->
    <item android:state_activated="true" android:drawable="@color/pressed" />

    <item android:drawable="@android:color/transparent" />
</selector>

我没有在网格视图上设置android:listSelector属性。

但是我只需要针对我的GridView中的listSelector项的解决方案。 - intrepidkarthi
是的。不需要其他代码。像你的一样使用CHOICE_MODE_MULTIPLE_MODAL。此外,我省略了属性android:choiceModeandroid:drawSelectorOnTop - dokkaebi
但这只适用于背景。我想要它在网格视图项目的顶部。我在网格视图项目的顶部有一个半透明的覆盖层。 - intrepidkarthi
不,我想在那种情况下它不会起作用。我也无法使用GridView的listSelector使其工作。如果您找不到真正的解决方案,可以将选择器放在列表项视图内的覆盖视图上作为解决方法。祝你好运。 - dokkaebi
不完美,但有用的提示。我为此点赞+1..!! - Mayur R. Amipara

0

为此,您需要在单击/长按时更改网格视图项的背景颜色。

以下是相应的参考代码:

GridView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        mAdapter.setSelected(position,true);                                          
        view.setBackgroundColor(Color.XYZ);
    }
}

希望这有所帮助。谢谢。

我需要一个透明的覆盖层在顶部,而不是在背景上。 - intrepidkarthi
然后您就不需要调用setBackgroundColor,但请记住您的视图背景应该是透明的(以便在其上叠加)。一旦您调用了setSelected(),GridView将根据选择器XML选择项目。 - Munish Katoch

0
在你的网格项中添加填充。 为网格适配器中的每个对象维护一个bean类,以跟踪对象是否被选中或取消选中。 根据此值,您可以根据所选/未选状态更新网格项的背景颜色。 在onitemclieck监听器中更新对象值和视图背景。

0

这可以通过在适配器内跟踪所选项目并更改它们的背景来实现。

我猜你可能会从这篇帖子中得到一点帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接