ListView中的Android自定义视图setSelected(true)撤消

埃利泽

我有一个,ListView其项目可以处于以下三种状态之一:选中,多选或无。

选中该项目后,意味着用户刚刚单击(选中)该项目,并且该行的背景应更改为所选的可绘制对象。

如果处于多选模式,则表示用户长按了一个项目,并将列表置于多选模式。该初始项设置为多选,然后单击的任何后续项都将进入多选模式,直到多选结束(退格,取消选择所有多选项等)。多选行的背景应设置为多选可绘制对象。

否则,它处于“无”状态,并且背景是透明的。

我遇到的问题是,当某项应处于选定模式时,我在中调用View.setSelected(true)选定位置的视图getView()我在应用程序中有两个使用此模式的地方。在一个地方,它运行完美,但是在另一个地方,似乎是View.setSelected(false)从我返回的东西(不是我)在我选择的行上调用getView()

这是我初始化ListView的方法(充气后):

lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View clickedItem, int position, long id) {
        if(adapter.isMultiSelect()) {
            ((ListView)parent).setItemChecked(position, !adapter.isPositionInMultiSelect(position));
        }
        else {
            adapter.setNewSelectedPosition(position);

            //do something
        }
    }
});
lv.setMultiChoiceModeListener(new MyMultiChoiceModeListener(adapter));

adapter.setNewSelectedPosition()来电notifyDataSetChanged()这是我的getView()

public View getView(final int position, View convertView, final ViewGroup parent) {     
    if(convertView == null) {
        convertView = new MyListRow(context);
    }

    boolean isSelected = isPositionInMultiSelect(position) || position == getSelectedPosition();

    SelectionType selectionType = SelectionType.NONE;
    if(isMultiSelect() && selectedPosition == position) {
        if(isPositionInMultiSelect(position)) {
            selectionType = SelectionType.MULTI_SELECT;
        }
        else {
            selectionType = SelectionType.NONE;
        }
        selectedPosition = NO_SELECTION_POSITION;
    }
    else if(isSelected) {
        if(isMultiSelect()) {
            selectionType = SelectionType.MULTI_SELECT;
        }
        else {
            selectionType = SelectionType.SELECTED_ITEM;
        }
    }

    ((MyListRow) convertView).updateViews(isSelected, selectionType);

    return convertView;
}

这里是MyListRow

public MyListRow(Context context) {
    super(context);

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.my_row, this, true);

    setPadding(20, 20, 20, 20);

    setViewBackground(R.drawable.list_row_selector);

    setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);     
}

public void updateViews(boolean isSelected, SelectionType selectionType) {
    if(isSelected) {
        if(selectionType == SelectionType.MULTI_SELECT) {
            setSelected(false);
        }
        else {
            setSelected(true);
        }
    }
    else {
        setSelected(false);
    }

    //do stuff
}

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
private void setViewBackground(int res) {
    Drawable d = getContext().getResources().getDrawable(res);
    Rect drawablePadding = new Rect();
    d.getPadding(drawablePadding);
    int top = getPaddingTop() + drawablePadding.top;
    int left = getPaddingLeft() + drawablePadding.left;
    int right = getPaddingRight() + drawablePadding.right;
    int bottom = getPaddingBottom() + drawablePadding.bottom;

    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        setBackgroundDrawable(d);
    }
    else {
        setBackground(d);
    }

    setPadding(left, top, right, bottom);
}

最后是list_row_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:drawable="@drawable/list_selector_pressed"
    android:state_pressed="true" />
<item
    android:drawable="@drawable/list_selector_pressed"
    android:state_selected="true" />
<item
    android:drawable="@drawable/list_selector_activated"
    android:state_activated="true" />
<item
    android:drawable="@android:color/transparent" />

埃利泽

无论出于何种原因,使用postsetSelected(true)都会使其起作用:

public void updateViews(boolean isSelected, SelectionType selectionType) {
    if(isSelected) {
        if(selectionType == SelectionType.MULTI_SELECT) {
            setSelected(false);
        }
        else {
            post(new Runnable() {
                @Override
                public void run() {
                    setSelected(true);
                }
            });
        }
    }
    else {
        setSelected(false);
    }

    //do stuff
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中的自定义图片视图上撤消绘图

来自分类Dev

Android中的自定义键盘视图

来自分类Dev

Android中的自定义视图

来自分类Dev

在Android中旋转自定义视图

来自分类Dev

在Android中实现自定义ListView

来自分类Dev

在Android中搜索自定义Listview?

来自分类Dev

Android ListView中的自定义字体?

来自分类Dev

自定义listview与shodows到android中的listview行

来自分类Dev

Android +自定义ListView

来自分类Dev

Android自定义Listview

来自分类Dev

自定义UIButton setSelected奇怪的行为

来自分类Dev

Android-将自定义视图添加到ListView(以在侧面菜单中获得暗淡效果)

来自分类Dev

在android中的自定义图片视图上绘制

来自分类Dev

如何在Android中过滤自定义列表视图

来自分类Dev

如何在Android中实现自定义堆栈视图?

来自分类Dev

android更新asynctask中的自定义视图

来自分类Dev

Android中自定义搜索视图的侦听器

来自分类Dev

Android中的操作栏上的“自定义”视图问题

来自分类Dev

Android:XML布局中的自定义视图

来自分类Dev

我可以在android中自定义视图吗?

来自分类Dev

Android中自定义视图上的按钮面板

来自分类Dev

自定义视图在Android Lollipop中不起作用

来自分类Dev

Android中的自定义“共享到”视图

来自分类Dev

如何在android中创建自定义视图

来自分类Dev

在android中创建自定义列表视图

来自分类Dev

在Android Studio中找不到我的自定义视图的自定义属性

来自分类Dev

在android自定义listview中重复的列表项

来自分类Dev

在自定义listview android中获取JSON结果

来自分类Dev

在Android的自定义ListView中绘制矩形