2

我有一个 Horizo​​ntalListView https://github.com/vieux/Android-Horizo ​​ntal- 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 以获得相同的结果。

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

4

1 回答 1

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 手势检测器声明中,我将此功能添加到 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);
        }
    }

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

于 2012-10-31T23:19:30.213 回答