Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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_Listview_Swipe - Fatal编程技术网

Android 沿手指滑动listView中的项目

Android 沿手指滑动listView中的项目,android,listview,swipe,Android,Listview,Swipe,我想在ExpandablelistView中滑动一个项目,并将其推离屏幕。我现在可以做了,但是当我的刷卡手势结束时,这个动作就会执行,我希望它能像你刷卡电子邮件时的gmail新应用一样,用我的手指准确地移动。(随着翻译的增加,我也希望有透明度) 你能帮我提供一些建议或教程链接吗 我有一个扩展BaseExpandableAdapter的适配器,一个用于检测滑动手势的类和一个main活动 主要活动类 public class MainActivity extends Activity impleme

我想在
ExpandablelistView
中滑动一个项目,并将其推离屏幕。我现在可以做了,但是当我的刷卡手势结束时,这个动作就会执行,我希望它能像你刷卡电子邮件时的gmail新应用一样,用我的手指准确地移动。(随着翻译的增加,我也希望有透明度) 你能帮我提供一些建议或教程链接吗

我有一个扩展
BaseExpandableAdapter
的适配器,一个用于检测滑动手势的类和一个
main活动

主要活动类

public class MainActivity extends Activity implements OnScrollListener{
    ExpandableListView lv1;
    private CustomListAdapter cla;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (ExpandableListView) findViewById(R.id.list);
        final SwipeDetector swipeDetector = new SwipeDetector();
        lv1.setOnTouchListener(swipeDetector);
        cla = new CustomListAdapter(this);
        addData();
        lv1.setAdapter(cla);
        lv1.setOnScrollListener(this);
        lv1.setOnChildClickListener(new OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                Object o = cla.getGroup(groupPosition);
                MatchResult m =((trnmSeparator) o).getMatches().get(childPosition);
                //int type = (Integer) rowType.get(position);
                if (swipeDetector.swipeDetected()){
                    // do the onSwipe action
                    //Toast.makeText(MainActivity.this, "SWIPE :" + " " + m , Toast.LENGTH_SHORT).show();
                    float dest = 0;
                    v = v.findViewById(R.id.match);
                    float place = v.getX();
                    if (swipeDetector.getAction() == Action.LR){
                        if (place == 0) dest =  v.getWidth();
                        else if (place > 0) dest = v.getWidth();
                        else if (place < 0) dest = 0;
                    } 
                    else if (swipeDetector.getAction() == Action.RL){
                        if (place == 0) dest =  -v.getWidth();
                        else if (place > 0) dest = 0;
                        else if (place < 0) dest = -v.getWidth();
                    } 
                    ObjectAnimator oa = ObjectAnimator.ofFloat(v, "x", dest);
                    oa.setDuration(700);
                    oa.start();
                    Log.v("view type", v.toString());
                    return false;
                } else {
                    // do the onItemClick action
                    Toast.makeText(MainActivity.this, "Selected :" + " " + m, Toast.LENGTH_SHORT).show();
                    return true;
                }
            }
        });

        lv1.setOnGroupClickListener(new OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                if (swipeDetector.swipeDetected()){
                    // do the onSwipe action
                    Object o = lv1.getItemAtPosition(groupPosition);
                    Toast.makeText(MainActivity.this, "SWIPE :" + " " + o , Toast.LENGTH_SHORT).show();
                    return true;
                }
                if (lv1.isGroupExpanded(groupPosition)){
                    Object o = cla.getGroup(groupPosition);
                    Log.v("type", o.getClass().toString());
                    for (int i = 0; i < ((trnmSeparator) o).getMatches().size(); i++){
                        lv1.getChildAt(i).setX(0f);
                    }
                }
                return false;
            }
        });

        lv1.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                Toast.makeText(MainActivity.this, "Long Press" + lv1.getItemAtPosition(arg2), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;  //maybe add a padding 
        if(loadMore) {
            addData();
            //cla.count += visibleItemCount; // or any other amount
            cla.notifyDataSetChanged();
        }
    }
}
public类MainActivity扩展活动实现OnScrollListener{
可扩展列表视图1级;
私有客户列表适配器cla;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv1=(ExpandableListView)findViewById(R.id.list);
最终SwipeDetector SwipeDetector=新SwipeDetector();
lv1.setOnTouchListener(swipeDetector);
cla=新的CustomListAdapter(此);
addData();
1级。设置适配器(cla);
lv1.setOnScrollListener(此);
lv1.setOnChildClickListener(新的OnChildClickListener(){
@凌驾
公共布尔onChildClick(ExpandableListView父视图,视图v,
int groupPosition、int childPosition、long id){
对象o=cla.getGroup(groupPosition);
MatchResult m=((trnmSeparator)o).getMatches().get(childPosition);
//int type=(整数)rowType.get(位置);
if(swipedtector.swipedtected()){
//执行onswip操作
//Toast.makeText(MainActivity.this,“滑动:+”+m,Toast.LENGTH\u SHORT.show();
浮点数=0;
v=v.findViewById(R.id.match);
浮动位置=v.getX();
if(swipedtector.getAction()==Action.LR){
如果(place==0)dest=v.getWidth();
如果(place>0)dest=v.getWidth(),则为else;
如果(位置<0)dest=0,则为else;
} 
else if(swipedector.getAction()==Action.RL){
如果(place==0)dest=-v.getWidth();
如果(位置>0)dest=0,则为else;
如果(place<0)dest=-v.getWidth();
} 
ObjectAnimator oa=ObjectAnimator.offload(v,“x”,dest);
oa.持续时间(700);
oa.start();
Log.v(“视图类型”,v.toString());
返回false;
}否则{
//执行mclick操作
Toast.makeText(MainActivity.this,“Selected:+”+m,Toast.LENGTH\u SHORT.show();
返回true;
}
}
});
lv1.setOnGroupClickListener(新的OnGroupClickListener(){
@凌驾
公共布尔值onGroupClick(ExpandableListView父视图,视图v,
int groupPosition,长id){
if(swipedtector.swipedtected()){
//执行onswip操作
对象o=lv1.getItemAtPosition(groupPosition);
Toast.makeText(MainActivity.this,“滑动:+”+o,Toast.LENGTH\u SHORT.show();
返回true;
}
if(1级isGroupExpanded(groupPosition)){
对象o=cla.getGroup(groupPosition);
Log.v(“type”,o.getClass().toString());
对于(int i=0;i<((trnmSeparator)o).getMatches().size();i++){
1级。getChildAt(i)。setX(0f);
}
}
返回false;
}
});
lv1.setOnItemLongClickListener(新的OnItemLongClickListener(){
@凌驾
长单击(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
Toast.makeText(MainActivity.this,“长按”+lv1.getItemAtPosition(arg2),Toast.LENGTH_SHORT.show();
返回false;
}
});
}
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
//TODO自动生成的方法存根
boolean loadMore=firstVisibleItem+visibleItemCount>=totalItemCount;//可能会添加一个填充
如果(加载更多){
addData();
//cla.count+=visibleItemCount;//或任何其他金额
cla.notifyDataSetChanged();
}
}
}
还有我的刷卡检测器

package com.example.jadidtar;

import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class SwipeDetector implements View.OnTouchListener {
    public static enum Action {
        LR, // Left to Right
        RL, // Right to Left
        None // when no action was detected
    }

    private static final String logTag = "SwipeDetector";
    private static final int HORIZONTAL_MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;
    private Action mSwipeDetected = Action.None;

    public boolean swipeDetected() {
        return mSwipeDetected != Action.None;
    }

    public Action getAction() {
        return mSwipeDetected;
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                downX = event.getX();
                downY = event.getY();
                mSwipeDetected = Action.None;
                return false; // allow other events like Click to be processed
            }
            case MotionEvent.ACTION_MOVE: {
                upX = event.getX();
                upY = event.getY();

                float deltaX = downX - upX;
                float deltaY = downY - upY;

                // horizontal swipe detection
                if (Math.abs(deltaX) > HORIZONTAL_MIN_DISTANCE) {
                    // left or right
                    if (deltaX < 0) {
                        mSwipeDetected = Action.LR;
                        return true;
                    }
                    if (deltaX > 0) {
                        mSwipeDetected = Action.RL;
                        return true;
                    }
                } 
                return false;
            }
        }
        return false;
    }
}
package com.example.jadidtar;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
公共类SwipeDetector实现View.OnTouchListener{
公共静态枚举操作{
LR,//从左到右
RL,//从右到左
无//未检测到任何操作时
}
私有静态最终字符串logTag=“SwipeDetector”;
专用静态最终整数水平最小距离=100;
私人浮动downX,downY,upX,upY;
私有操作mSwipeDetected=操作。无;
公共布尔swipedtected(){
返回mSwipeDetected!=操作。无;
}
公共行动{
检测到返回消息;
}
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:{
downX=event.getX();
downY=event.getY();
mSwipeDetected=操作。无;
return false;//允许处理单击等其他事件
}
case MotionEvent.ACTION\u移动:{
upX=event.getX();
upY=event.getY();
VelocityTracker _VelocityTracker;
int _slop; 

ViewConfiguration vc = ViewConfiguration.get(context);
_slop = vc.getScaledTouchSlop();

 [.........code ......]

_dividerRow.setOnTouchListener(new MyGestureListener()
                );


class MyGestureListener implements OnTouchListener{
        private PointF _init;
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch(event.getAction())
            {
            case MotionEvent.ACTION_DOWN :
                _init = new PointF(event.getRawX(), event.getRawY());
                if(!(v == null))
                {
                    _VelocityTracker = VelocityTracker.obtain();
                    _VelocityTracker.addMovement(event);
                }

                break;

            case MotionEvent.ACTION_UP :
                break;

            case MotionEvent.ACTION_MOVE :
                if(event.getX() > 0)
                {
                        _VelocityTracker.addMovement(event);
                        float diffX = event.getRawX() - _init.x;
                        float diffY = event.getRawY() - _init.y;

                        if (Math.abs(diffX) > _slop && Math.abs(diffX) > Math.abs(diffY)) {
                            _swipping = true;
                            ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);

                            MotionEvent cancelEvent = MotionEvent.obtain(event);
                            cancelEvent.setAction(MotionEvent.ACTION_CANCEL | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
                            v.onTouchEvent(cancelEvent);
                        } 

                        if(_swipping == true)
                        {

                            ViewHelper.setTranslationX(v, diffX);
                        }
                    }

                break;
            }
            return false;
        }
    }