Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的ListView项目一次滚动一个_Android_Android Layout_Gestures - Fatal编程技术网

Android中的ListView项目一次滚动一个

Android中的ListView项目一次滚动一个,android,android-layout,gestures,Android,Android Layout,Gestures,我们是否可以一次只滚动一个ListView项。 就像当你向上滑动时,它只会向上滚动一个项目,而不正常滚动类似于向下滚动,只会向下移动一个项目 请帮忙 这是我的密码: public class ListViewTestExample extends Activity { ListView listView; private GestureDetectorCompat mDetector; @Override protected void onCreate(Bu

我们是否可以一次只滚动一个
ListView
项。 就像当你向上滑动时,它只会向上滚动一个项目,而不正常滚动类似于向下滚动,只会向下移动一个项目

请帮忙

这是我的密码:

public class ListViewTestExample extends Activity {

    ListView listView;

    private GestureDetectorCompat mDetector;

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

        mDetector = new GestureDetectorCompat(this, new MyGestureListener());
        // Grid ListView object from XML
        listView = (ListView) findViewById(R.id.list);

        mDetector = new GestureDetectorCompat(this, new MyGestureListener());
        // Defined Array values to show in ListView

        String[] values = new String[] { "Android List View",
         "Adapter implementation", "Simple List View In Android",
         "Create List View Android", "Android Example",
         "List View Source Code", "List View Array Adapter",
         "Android Example List View" };

         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
         android.R.layout.simple_list_item_1, android.R.id.text1, values);

         listView.setAdapter(adapter);       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public boolean onTouchEvent(MotionEvent event) {
        this.mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        Context context = getApplicationContext();

        public boolean onDown(MotionEvent event) {
                return true;
        }

        public void onLongPress(MotionEvent event) {
            Toast.makeText(context, "Long Press", Toast.LENGTH_SHORT).show();
        }

        public boolean onFling(MotionEvent event1, MotionEvent event2,
                float velocityX, float velocityY) {

            float sensitvity = 50;

            // TODO Auto-generated method stub
            if ((event1.getX() - event2.getX()) > sensitvity) {
                Toast.makeText(context, "Swipe Left", Toast.LENGTH_SHORT)
                    .show();
            } else if ((event2.getX() - event1.getX()) > sensitvity) {
                Toast.makeText(context, "Swipe Right", Toast.LENGTH_SHORT)
                    .show();
            }
            if ((event1.getY() - event2.getY()) > sensitvity) {
                if (event2.getPressure() > event1.getPressure()) {
                    Toast.makeText(context, "Swipe Up + Hold",
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Swipe Up", Toast.LENGTH_SHORT).show();
                }
            } else if ((event2.getY() - event1.getY()) > sensitvity) {
                if (event2.getPressure() > event1.getPressure()) {
                    Toast.makeText(context, "Swipe Down + Hold",
                        Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Swipe Down", Toast.LENGTH_SHORT).show();
                }
            }
            return true;
        }

        public boolean onSingleTapConfirmed(MotionEvent event) {
            Toast.makeText(context, "Single Tap Confirmed", Toast.LENGTH_SHORT)
                .show();
            return true;
        }

        public boolean onDoubleTap(MotionEvent event) {
            Toast.makeText(context, "Double Tap Confirmed", Toast.LENGTH_SHORT).show();
            return true;
        }

    }

}
公共类ListViewTestExample扩展活动{
列表视图列表视图;
私人手势检测器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u main\u list\u view\u test);
mDetector=new GestureDetectorCompat(这个,new MyGestureListener());
//来自XML的网格ListView对象
listView=(listView)findViewById(R.id.list);
mDetector=new GestureDetectorCompat(这个,new MyGestureListener());
//要在ListView中显示的已定义数组值
字符串[]值=新字符串[]{“Android列表视图”,
“适配器实现”、“Android中的简单列表视图”,
“创建列表视图Android”、“Android示例”,
“列表视图源代码”、“列表视图阵列适配器”,
“Android示例列表视图”};
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,android.R.id.text1,值);
setAdapter(适配器);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
公共布尔onTouchEvent(运动事件){
this.mDetector.onTouchEvent(事件);
返回super.onTouchEvent(事件);
}
类MyGestureListener扩展了GestureDetector.SimpleOnGestureListener{
Context=getApplicationContext();
公共布尔onDown(运动事件){
返回true;
}
public void onLongPress(运动事件){
Toast.makeText(上下文,“长按”,Toast.LENGTH_SHORT).show();
}
公共布尔onFling(MotionEvent1、MotionEvent2、,
浮动速度x,浮动速度y){
浮感度=50;
//TODO自动生成的方法存根
if((event1.getX()-event2.getX())>sensitivity){
Toast.makeText(上下文,“向左滑动”,Toast.LENGTH\u SHORT)
.show();
}else if((event2.getX()-event1.getX())>sensitivity){
Toast.makeText(上下文,“向右滑动”,Toast.LENGTH\u SHORT)
.show();
}
if((event1.getY()-event2.getY())>sensitivity){
if(event2.getPressure()>event1.getPressure()){
Toast.makeText(上下文,“向上滑动+按住”,
吐司。长度(短)。show();
}否则{
Toast.makeText(上下文,“向上滑动”,Toast.LENGTH_SHORT.show();
}
}else if((event2.getY()-event1.getY())>sensitivity){
if(event2.getPressure()>event1.getPressure()){
Toast.makeText(上下文,“向下滑动+按住”,
吐司。长度(短)。show();
}否则{
Toast.makeText(上下文,“向下滑动”,Toast.LENGTH_SHORT.show();
}
}
返回true;
}
公共布尔值OnSingleTapConfiged(MotionEvent事件){
Toast.makeText(上下文,“单点击确认”,Toast.LENGTH\u SHORT)
.show();
返回true;
}
公共布尔onDoubleTap(运动事件){
Toast.makeText(上下文,“双击确认”,Toast.LENGTH_SHORT.show();
返回true;
}
}
}

您可以在onTouchListener()中使用listView.SetScroly(int值)。您可以截取触摸事件并测量项目视图的高度,然后使用SetScroly(当前listView高度+项目高度)。

我知道这是一篇老文章,但我已经搜索了网络,并没有真正找到解决方案。所以我找到了一个适合我的解决方案。您需要创建自定义ListView并重写dispatchTouchEvent函数。我的版本会检查用户是否以最小速度轻弹,然后是否平滑滚动到下一个项目。如果低于此速度,则检查项目是否超过一半,然后进行平滑滚动。否则返回到当前项。此代码假定该项填充视图

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.widget.ListView;

/**
 * Created by bradj on 11/12/13.
 */
public class SingleScrollListView extends ListView
{
    private boolean mSingleScroll = false;
    private VelocityTracker mVelocity = null;
    final private float mEscapeVelocity = 2000.0f;
    final private int mMinDistanceMoved = 20;
    private float mStartY = 0;

    public SingleScrollListView(Context context)
    {
        super(context);
    }

    public SingleScrollListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public SingleScrollListView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public void setSingleScroll(boolean aSingleScroll) { mSingleScroll = aSingleScroll; }
    public int getVerticalScrollOffset() { return getFirstVisiblePosition(); }

    @Override
    public boolean dispatchTouchEvent(MotionEvent aMotionEvent)
    {
        if (aMotionEvent.getAction() == MotionEvent.ACTION_DOWN)
        {
            if (mSingleScroll && mVelocity == null)
                mVelocity = VelocityTracker.obtain();
            mStartY = aMotionEvent.getY();
            return super.dispatchTouchEvent(aMotionEvent);
        }

        if (aMotionEvent.getAction() == MotionEvent.ACTION_UP)
        {
            if (mVelocity != null)
            {
                if (Math.abs(aMotionEvent.getY() - mStartY) > mMinDistanceMoved)
                {
                    mVelocity.computeCurrentVelocity(1000);
                    float velocity = mVelocity.getYVelocity();

                    if (aMotionEvent.getY() > mStartY)
                    {
                        // always lock
                        if (velocity > mEscapeVelocity)
                            smoothScrollToPosition(getFirstVisiblePosition());
                        else
                        {
                            // lock if over half way there
                            View view = getChildAt(0);
                            if (view != null)
                            {
                                if (view.getBottom() >= getHeight() / 2)
                                    smoothScrollToPosition(getFirstVisiblePosition());
                                else
                                    smoothScrollToPosition(getLastVisiblePosition());
                            }
                        }
                    }
                    else
                    {
                        if (velocity < -mEscapeVelocity)
                            smoothScrollToPosition(getLastVisiblePosition());
                        else
                        {
                            // lock if over half way there
                            View view = getChildAt(1);
                            if (view != null)
                            {
                                if (view.getTop() <= getHeight() / 2)
                                    smoothScrollToPosition(getLastVisiblePosition());
                                else
                                    smoothScrollToPosition(getFirstVisiblePosition());
                            }
                        }
                    }
                }
                mVelocity.recycle();
            }
            mVelocity = null;

            if (mSingleScroll)
            {
                if (Math.abs(aMotionEvent.getY() - mStartY) > mMinDistanceMoved)
                    return super.dispatchTouchEvent(aMotionEvent);
            }
            else
                return super.dispatchTouchEvent(aMotionEvent);
        }

        if (mSingleScroll)
        {
            if (mVelocity == null)
            {
                mVelocity = VelocityTracker.obtain();
                mStartY = aMotionEvent.getY();
            }
            mVelocity.addMovement(aMotionEvent);
        }

        return super.dispatchTouchEvent(aMotionEvent);
    }
}

显示您到目前为止所做的工作。我找到了解决方案,但最大的问题是,当ListView滚动时,它的新项目不会被呈现..:(你能发布你的解决方案吗?出色的解决方案,将
getLastVisiblePosition()
的所有引用更改为
getFirstVisiblePosition()+1
一个接一个地滚动/甩动ListView。你是救世主!!感谢这个惊人的解决方案..:)它给出了运行时错误…膨胀类SingleScrollListView
listView = (SingleScrollListView) findViewById(R.id.list);
listView.setSingleScroll(true);