我有一个,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" />
无论出于何种原因,使用post
setSelected(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] 删除。
我来说两句