具有图像选择和取消选择的Horizo​​ntalListview

时间:2012-12-17 10:28:10

标签: android android-widget android-listview android-2.2-froyo horizontalscrollview

我在listiview中的图片select/unselect中遇到了问题。 就我而言,

ByDefault->image color(Yellow)
First click->image color(Orange)
Second click->image color(Yellow)

如果用户点击途中然后完美,但是当用户第一次点击第一张图片并第二次点击第二张图片时,两种图像颜色都是橙色(这是问题)。

在我的情况下,一次只有一种图像颜色为橙色(表示已选中)。

1 个答案:

答案 0 :(得分:1)

  1. 如果你只支持HoneyComb及以上版本,那就很简单了。创建一个StateListDrawable并将其设置为列出视图项的背景。
  2. <强> selector.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_activated="true" android:drawable="@drawable/item_focus" />
        <item android:drawable="@android:color/transparent" />
    </selector>
    

    listview项目的布局

    <ImageView
        android:id="@+id/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:padding="5dp" />
    

    和最后一个,将listview选择模式设置为SINGLE

    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    

    2。如果您设法支持预装HoneyComb,则必须编写自己的布局工具。您这样做是为了使用选中状态进行解决。让我们举一个使用LinearLayout的例子(你可以和其他人一样)。

     package com.example.listviewactivestate;
    
     import android.content.Context;
     import android.util.AttributeSet;
     import android.view.View;
     import android.widget.Checkable;
     import android.widget.LinearLayout;
    
     public class CustomLinearLayout extends LinearLayout implements Checkable {
    
    
    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
    
    private boolean checked = false;
    
    public CustomLinearLayout (Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public CustomLinearLayout (Context context) {
        super(context);
    }
    
    @Override
    public boolean isChecked() {
        return checked;
    }
    
    @Override
    public void setChecked(boolean checked) {
        this.checked = checked;
    
        refreshDrawableState();
    
        // Propagate to childs
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child instanceof Checkable) {
                ((Checkable) child).setChecked(checked);
            }
        }
    }
    
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
    
    @Override
    public void toggle() {
        this.checked = !this.checked;
    }
     }
    

    在xml中使用此自定义视图

     <?xml version="1.0" encoding="utf-8"?>
     <com.example.listviewactivestate.CustomLinearLayout 
    
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/selector"
    >
    
    <ImageView
        android:id="@+id/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:padding="5dp" />
    
    </com.example.listviewactivestate.CustomLinearLayout >
    

    state_activated更改为state_checked

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_checked="true" android:drawable="@drawable/item_focus" />
       <item android:drawable="@android:color/transparent" />
    </selector>
    

    还将listview选择模式设置为SINGLE。如果它不起作用,请像这样添加onItemClickEvent

    list.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    // TODO Auto-generated method stub
                    list.setItemChecked(position, true);//make sure click item is set to checked.
    
                }
            });