是否有可能使ListView水平?我使用图库视图完成了此操作,但所选项目会自动出现在屏幕的中心。我不希望选中的项目位于我点击的同一位置。我该如何纠正这个问题?我的想法是用水平滚动来设置ListView。分享你的想法?


当前回答

@Paul回答链接到一个伟大的解决方案,但代码不允许对项目的孩子使用onClickListeners(回调函数永远不会被调用)。我一直在努力寻找一个解决方案,我决定在这里张贴你需要修改的代码(以防有人需要它)。

而不是重写dispatchTouchEvent重写onTouchEvent。使用dispatchTouchEvent的相同代码并删除方法(您可以在这里阅读两者之间的区别http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers)

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

然后,添加下面的代码,它将决定从子项中窃取事件,并将其交给我们的onTouchEvent,或让它由它们处理。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

最后,不要忘记在你的类中声明变量:

private float mInitialX;
private float mInitialY;

其他回答

这有点(非常)晚了,但我把它贴出来,以防以后有人来看。

在Android L预览版的支持库中,有一个RecyclerView,它完全是你想要的。

现在,你只能通过L预览SDK获得它,你需要将你的minSdk设置为L。但是你可以将所有必要的文件复制到你的项目中,并以这种方式使用它们,直到L正式发布。

你可以在这里下载预览文档。

警告:回收器视图的API可能会改变,它可能有bug。

更新

水平列表视图的源代码是:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

你总是可以创建你的textviews等动态和设置你的onclicklistener,就像你会做一个适配器

有一个很棒的库,叫做TwoWayView,它很容易实现,只需要将项目库包含到你的工作空间中,并将其作为库项目添加到你的原始项目中,然后遵循以下步骤,这是最初在这里提到的:

首先,让我们添加一个样式来指示ListView的方向 (水平或垂直)in (res/values/styles.xml):

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

然后,

在你的布局XML中,使用下面的代码来添加TwoWayView:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

最后,声明它并像任何常规的ListView一样处理它:

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

ListView的所有方法将在这里照常工作,但只有一个区别,我注意到,这是设置选择模式时,方法setChoiceMode不接受int值,而是从enum称为ChoiceMode的值,所以list_view.setChoiceMode(ListView. choice_mode_single);将lvTest.setChoiceMode(choicmode . single);//或多重或无。

Paul没有费心去修复他的库中的bug或接受用户的修复。这就是为什么我建议另一个具有类似功能的库:

https://github.com/sephiroth74/HorizontalVariableListView

更新:2013年7月24日作者(sephiroth74)发布了基于android 4.2.2 ListView代码的完全重写版本。我必须说,它没有所有的错误,以前的版本有和伟大的工作!

因为谷歌引入了Android支持库v7 21.0.0,你可以使用RecyclerView水平滚动项目。RecyclerView小部件是ListView的一个更高级、更灵活的版本。

要使用RecyclerView,只需添加依赖项:

com.android.support:recyclerview-v7:23.0.1

下面是一个例子:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

关于RecyclerView的更多信息:

https://developer.android.com/training/material/lists-cards.html https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html