마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ListView의 selector 질문입니다.

0 추천
ListView를 RadioButton과 ToggleButton의 기능을 합한 것처럼 아이템을 클릭하면 다른 행을 클릭하거나 자기 자신을 한번 더 클릭한 때까지 selector를 유지하고 싶은데 단순히 selector xml에 있는 속성을 이것저것 조합해 보았는데 원하는 결과가 나오지 않더군요.

selector를 빼버리고 각 아이템 객체에 선택여부 체크 변수를 넣어서 선택시 getView()에서 backgound색을 변경하는 방식으로 하였는데 배경 전환이 좀 늦고 selector는 RadioButton방식이 기본적으로 가능하기 때문에 가급적이면 selector를 사용하고 싶어서 xml로 selector를 만들어서 저런 방식이 가능한지 궁금합니다.

또 추가적으로 listview.setSelector로 xml을 주지 않고 color값만 넣으면 다른 행을 선택하기 전까지 배경색은 유지 되는데 선택된 행이 화면밖으로 빠르게 스크롤 되면 selector가 뷰 끝에 살짝 걸려서 남아있는 현상이 발생합니다. 이 것을 해결할 수 있는 방법도 있다면 답변 부탁드립니다.
appa (3,380 포인트) 님이 2013년 3월 8일 질문

1개의 답변

0 추천
 
채택된 답변

CheckedTextView라는 뷰가 있습니다. 이 뷰를 참고하셔서 만드시면 될거 같은데요

실제 코드 내부를 보면 Checkable를 implement해서 구현됐던거로 기억을 하는데요

체크 기능을 가진 뷰로 재정의 하셔서 사용하시면 될거 같습니다

 

예전에 제가 썻던 방식입니다...

최상위 뷰는 부조건 Check기능을 가진 레이아웃이여야 하며

하위 뷰에도 Check (on/off)값을 넘겨 줘야 하위 뷰에도 적용 됩니다.

 

 

public class CheckedRelativeLayout extends RelativeLayout implements Checkable {
    private boolean mChecked;
//    private int mCheckMarkResource;
    private Drawable mCheckMarkDrawable;
//    private int mBasePaddingRight;
//    private int mCheckMarkWidth;
 
    private static final int[] CHECKED_STATE_SET = {
        R.attr.state_checked
    };
 
    public CheckedRelativeLayout(Context context) {
        this(context, null);
    }
 
    public CheckedRelativeLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
 
    public CheckedRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
 
        setChecked(false);
 
    }
 
    public void toggle() {
        setChecked(!mChecked);
    }
    
    public boolean isChecked() {
        return mChecked;
    }
 
    /**
     * <p>Changes the checked state of this text view.</p>
     *
     * @param checked true to check the text, false to uncheck it
     */
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            
           
            int count = getChildCount();
            for(int i = 0; i < count; i++){
            if(getChildAt(i).getClass().getSimpleName().equalsIgnoreCase("CheckedTextView") ){
            CheckedTextView checkedTextView = (CheckedTextView)getChildAt(i);
            checkedTextView.setChecked(checked);
            }else if(getChildAt(i).getClass().getSimpleName().equalsIgnoreCase("CheckedRelativeLayout") ){
            CheckedRelativeLayout checkedRelativeLayout = (CheckedRelativeLayout)getChildAt(i);
            checkedRelativeLayout.setChecked(checked);
            }else if(getChildAt(i).getClass().getSimpleName().equalsIgnoreCase("CheckedLinearLayout") ){
            CheckedRelativeLayout checkedRelativeLayout = (CheckedRelativeLayout)getChildAt(i);
            checkedRelativeLayout.setChecked(checked);
            }else if(getChildAt(i).getClass().getSimpleName().equalsIgnoreCase("CheckBox") ){
            CheckBox checkbox = (CheckBox)getChildAt(i);
            checkbox.setChecked(checked);
            }
            }
            
            refreshDrawableState();
        }
    }
 
 
@Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
 
    @Override
    protected void drawableStateChanged() {
        super.drawableStateChanged();
        
        if (mCheckMarkDrawable != null) {
            int[] myDrawableState = getDrawableState();
            
            // Set the state of the Drawable
            mCheckMarkDrawable.setState(myDrawableState);
            
            invalidate();
        }
    }
 
    @Override
    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
    boolean populated = super.dispatchPopulateAccessibilityEvent(event);
    if (!populated) {
    event.setChecked(mChecked);
    }
    return super.dispatchPopulateAccessibilityEvent(event);
    }
}
jelly (1,630 포인트) 님이 2013년 3월 8일 답변
appa님이 2013년 3월 11일 채택됨
...