Horizo​​ntalListView选择器

时间:2012-10-31 17:55:20

标签: android

我有一个Horizo​​ntalListView https://github.com/vieux/Android-Horizontal-ListView,里面有几个项目,每个项目都有一个包含一些文本和图像的相对布局。我已经为这个相对布局添加了一个选择器,它在较新版本的android设置中很有效,白色按下时每个项目的相对布局为白色。

问题是在旧版本的android中,当我滚动时,Horizo​​ntalListview开始表现得很奇怪,这是因为我为每个相对布局添加了android:clickable =“true”。如果我删除此属性,HLV开始正常工作但选择器不起作用。

这是我的布局:

<RelativeLayout
        android:id="@+id/marcoNota"
        android:layout_width="@dimen/tile_width"
        android:layout_height="@dimen/tile_height"
        android:background="@drawable/tile_selector"
        android:clickable="true"
        android:paddingBottom="2dp"
        android:paddingTop="2dp"
        android:paddingLeft="2dp"
        android:paddingRight="2dp"> 
</RelativeLayout>

我甚至尝试在适配器上设置onTouchListener获得相同的结果。

我想知道是否可以使用选择器whitout设置Clickable =“true”或任何解决方法。

1 个答案:

答案 0 :(得分:2)

我解决了在Horizo​​ntalListView.java中实现以下方法的问题:

这用于检测Action_UP(当用户将手指从所选视图上抬起并绘制相对布局时将其保持为默认颜色):

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if(habilitar){
            if (event.getAction() == android.view.MotionEvent.ACTION_UP ||event.getAction() == android.view.MotionEvent.ACTION_CANCEL){
                for(int i=0;i<getChildCount();i++){
                    View child = getChildAt(i);
                    if (isEventWithinView2(event, child)) {
                        if(mOnItemUnSelectedListener != null){
                            mOnItemUnSelectedListener.onItemUnSelected(child);
                        }
                        break;
                    }
                    if(mOnItemUnSelectedListener != null && child != null){
                        mOnItemUnSelectedListener.onItemUnSelected(child);
                    }
                }
            }
        }

        return true;
    }

在mOnGesture gesturedetector声明中,我将此功能添加到onDown方法。当用户按下视图时,这允许绘制所选项目相对布局保持内容:

for(int i=0;i<getChildCount();i++){
                    View child = getChildAt(i);
                    if (isEventWithinView2(e, child)) {
                        if(mOnItemSelected != null){
                            mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));
                        }
                        break;
                    }
                }

然后我添加了一些监听器以允许适配器绘制按下的视图,对于取消选择监听器,我实现了以下接口:

private OnItemUnSelectedListener mOnItemUnSelectedListener;

public void setOnItemUnSelectedListener(OnItemUnSelectedListener listener ){
        mOnItemUnSelectedListener = listener;

}
public interface OnItemUnSelectedListener{
    public void onItemUnSelected(View v);
}

对于选定的侦听器,我使用了已在类中定义的侦听器:

private OnItemSelectedListener mOnItemSelected;

最后在我的适配器中我设置了监听器:

HorizontalListView listview = (HorizontalListView) retval.findViewById(R.id.listviewH);
listview.setOnItemSelectedListener(this);
listview.setOnItemUnSelectedListener(this);

并根据用户是否按下视图来设置布局的颜色

@Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
        if(arg1.findViewById(R.id.marcoNota) != null){
            arg1.findViewById(R.id.marcoNota).setBackgroundColor(Color.WHITE);
        }

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {


    }

    @Override
    public void onItemUnSelected(View v) {
        if(v.findViewById(R.id.marcoNota) != null){
        v.findViewById(R.id.marcoNota).setBackgroundColor(Color.BLACK);
        }
    }

我知道这是一个非常具体的问题,但是如果有人需要这样做的话。