首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HorizontalListView选择器

HorizontalListView选择器
EN

Stack Overflow用户
提问于 2012-11-01 01:55:20
回答 1查看 1.7K关注 0票数 2

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

问题是,在安卓的老版本中,当我滚动时,HorizontalListview开始变得奇怪,这是因为我在每个相对布局中都添加了android:clickable="true“。如果我删除这个属性,HLV开始正常工作,但是选择器不工作。

这是我的布局:

代码语言:javascript
复制
<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“或任何解决方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-01 07:19:30

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

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

代码语言:javascript
复制
@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方法中添加了此功能。这允许在用户按下视图时绘制包含内容的所选项目相对布局:

代码语言:javascript
复制
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;
                    }
                }

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

代码语言:javascript
复制
private OnItemUnSelectedListener mOnItemUnSelectedListener;

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

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

对于item selected listener,我使用了类中已经定义的监听器:

代码语言:javascript
复制
private OnItemSelectedListener mOnItemSelected;

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

代码语言:javascript
复制
HorizontalListView listview = (HorizontalListView) retval.findViewById(R.id.listviewH);
listview.setOnItemSelectedListener(this);
listview.setOnItemUnSelectedListener(this);

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

代码语言:javascript
复制
@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);
        }
    }

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13163936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档