里面的ListView滑动手势 - 机器人 [英] Swipe Gesture inside ListView - Android

查看:177
本文介绍了里面的ListView滑动手势 - 机器人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新手为Android。我上如何实现一个教程`的ListView 这里

我实现它,它工作正常。我需要实施 ViewSwitcher 的一样。当我刷卡歌就好了,我需要得到这样的玩一些选项添加到队列的等,

PLS通过该教程,并请帮助。我几乎是3周到挣扎。

希望有人能帮助我。

修改1 : 下面code为主要活动:

 进口的java.util.ArrayList;
进口的java.util.HashMap;

进口org.w3c.dom.Document中;
进口org.w3c.dom.Element中;
进口org.w3c.dom.NodeList;

进口android.app.Activity;
进口android.os.Bundle;
进口android.view.View;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;
进口android.widget.ListView;

进口android.view.GestureDetector;
进口android.view.GestureDetector.OnGestureListener;
进口android.view.MotionEvent;
进口android.widget.ViewSwitcher;

公共类CustomizedListView扩展活动实现OnGestureListener {
//所有静态变量
静态最终字符串URL =htt​​p://api.androidhive.info/music/music.xml;
// XML节点键
静态最后弦乐KEY_SONG =歌; //父节点
静态最后弦乐KEY_ID =ID;
静态最后弦乐KEY_TITLE =称号;
静态最后弦乐KEY_ARTIST =艺术家;
静态最后弦乐KEY_DURATION =持续时间;
静态最后弦乐KEY_THUMB_URL =thumb_url;


私人ViewSwitcher switcher1;
私人GestureDetector gesturedetector = NULL;
ListView控件列表;
LazyAdapter适配器;

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);

    ArrayList的< HashMap的<字符串,字符串>> songsList =新的ArrayList< HashMap的<字符串,字符串>>();

    XMLParser的分析器=新XMLParser的();
    XML字符串= parser.getXmlFromUrl(URL); //获取XML的URL
    文档DOC = parser.getDomElement(XML); //获取DOM元素

    NodeList的NL = doc.getElementsByTagName(KEY_SONG);
    //遍历所有歌曲节点<宋>
    的for(int i = 0; I< nl.getLength();我++){
        //创建新的HashMap
        HashMap的<字符串,字符串>图=新的HashMap<字符串,字符串>();
        元素e =(元)nl.item(我);
        //添加每个子节点HashMap中的key =>值
        map.put(KEY_ID,parser.getValue(即KEY_ID));
        map.put(KEY_TITLE,parser.getValue(即KEY_TITLE));
        map.put(KEY_ARTIST,parser.getValue(即KEY_ARTIST));
        map.put(KEY_DURATION,parser.getValue(即KEY_DURATION));
        map.put(KEY_THUMB_URL,parser.getValue(即KEY_THUMB_URL));

        //添加HashList到ArrayList中
        songsList.add(图)

    }


    名单=(ListView控件)findViewById(R.id.list);

    //通过传递XML数据的ArrayList获取适配器
    适配器=新LazyAdapter(这一点,songsList);
    list.setAdapter(适配器);


    // Click事件单列表行
    list.setOnItemClickListener(新OnItemClickListener(){

        公共无效onItemClick(适配器视图<>母公司视图中查看,
                INT位置,长的id){


        }
    });



}


@覆盖
公共布尔的onTouchEvent(MotionEvent事件){
        返回gesturedetector.onTouchEvent(事件);
}

公共布尔onDown(MotionEvent E){
    // TODO自动生成方法存根
    返回false;
}
INT SWIPE_MIN_VELOCITY = 100;
INT SWIPE_MIN_DISTANCE = 100;
// SA±起亚»‡ñKHIbạnVUA»'T MAñhìnhÄ'Æ°一桑麻»™吨bên无OÄ'ó

公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
    //获取位置
    浮ev1X = e1.getX();
    浮ev2X = e2.getX();

    //获取到X(E2)距离X(E1)的
    最终浮动xdistance = Math.abs(ev1X  -  ev2X);
    //获取cusor的veclocity
    //VáºnTA»C = SA'Ä'iểmảNH(PX)/ GIA¢ÿ
   最终浮动xvelocity = Math.abs(velocityX);

   //VáºnTA»'C雏鸭»ƒNA'A»•I X> 100 VAkhoả纳克cáchTA»«Ä'iểm嘉©ØÄ'ầuÄ'ếnÄ'iểm嘉©ØCUA»I> 100
   如果((xvelocity> SWIPE_MIN_VELOCITY)及及(xdistance> SWIPE_MIN_DISTANCE))
   {
        如果(ev1X> ev2X)//切换左
        {
            previousView();
        }
        否则//切换权
        {
            新思维();
        }
   }

    返回false;
}

公共无效onLong preSS(MotionEvent E){

}

公共布尔onScroll(MotionEvent E1,E2 MotionEvent,浮distanceX,浮distanceY){
    返回false;
}

公共无效OnShow中preSS(MotionEvent E){

}

公共布尔onSingleTapUp(MotionEvent E){
    返回false;
}

//接下来,previous浏览
私人无效previousView(){
    switcher1.show previous();
}
私人无效的新思维(){
    switcher1.showNext();
}
 

下面$ C C XML文件$。

 < XML版本=1.0编码=UTF-8&GT?;
  < ViewSwitcher的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
     机器人:ID =@ + ID / viewSwitcher1
     机器人:layout_width =WRAP_CONTENT
     机器人:layout_height =WRAP_CONTENT
     机器人:layout_alignParentLeft =真
     机器人:layout_alignParentTop =真正的>

   <包括
     机器人:layout_width =WRAP_CONTENT
     机器人:layout_height =WRAP_CONTENT
     布局=@布局/ list_row_main/>

   <包括
     机器人:layout_width =WRAP_CONTENT
     机器人:layout_height =WRAP_CONTENT
     布局=@布局/ list_row_swipe/>

< / ViewSwitcher>
 

解决方案

据我了解你的问题,你的问题是检测的ListView内的触摸手势,对吧?

因此​​,你必须扩展ListView和检测水平触摸手势<一href="http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29">onInterceptTouchEvent方法。

下面有是一个ListView,它不反应水平触摸事件的一个例子。这些事件将会被分派给你的孩子看,这实际上是你的列表项显示已经捕获这些事件(用手势监听器),并触发ViewSwitcher。

 公共类SampleListView扩展的ListView {

。
。
。

@覆盖
    公共布尔onInterceptTouchEvent(MotionEvent EV){
        开关(ev.getAction()){
            案例MotionEvent.ACTION_DOWN:
                //重新设置差值
                mDiffX = 0;
                mDiffY = 0;

                mLastX = ev.getX();
                mLastY = ev.getY();
                打破;

            案例MotionEvent.ACTION_MOVE:
                最终浮动CURX = ev.getX();
                最终浮动CURY = ev.getY();
                mDiffX + = Math.abs(CURX  -  mLastX);
                mDiffY + = Math.abs(CURY  -  mLastY);
                mLastX = CURX;
                mLastY = CURY;

                //不拦截事件,当用户试图垂直滚动
                如果(mDiffX&GT; mDiffY){
                    返回false; //还没有反应过来横向触摸事件,这些事件将被传递到您的列表项目视图
                }
        }

        返回super.onInterceptTouchEvent(EV);
    }

。
。
。

}
 

I am a newbie for Android. I got a tutorial on how to implement the `listView here:

I implemented it and it is working fine. I need to implement a ViewSwitcher for the same. Like when I swipe the song, I need to get some options like play, add to queue etc.,

Pls go through that tutorial and pls help. I'm struggling almost from 3 weeks.

Hope someone will help me.

Edit 1: The below code is the main Activity:

import java.util.ArrayList;
import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.ViewSwitcher;

public class CustomizedListView extends Activity implements OnGestureListener{
// All static variables
static final String URL = "http://api.androidhive.info/music/music.xml";
// XML node keys
static final String KEY_SONG = "song"; // parent node
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";
static final String KEY_DURATION = "duration";
static final String KEY_THUMB_URL = "thumb_url";


private ViewSwitcher switcher1;
private GestureDetector gesturedetector = null;
ListView list;
LazyAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_SONG);
    // looping through all song nodes <song>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
        map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
        map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));

        // adding HashList to ArrayList
        songsList.add(map);

    }


    list=(ListView)findViewById(R.id.list);

    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(this, songsList);        
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {


        }
    });



}   


@Override
public boolean onTouchEvent(MotionEvent event) {
        return gesturedetector.onTouchEvent(event);
}

public boolean onDown(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}
int SWIPE_MIN_VELOCITY = 100;
int SWIPE_MIN_DISTANCE = 100;
//Sự kiện khi bạn vuốt màn hình đưa sang một bên nào đó

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
    //Get Position
    float ev1X = e1.getX();
    float ev2X = e2.getX();

    //Get distance of X (e1) to X (e2)
    final float xdistance = Math.abs(ev1X - ev2X);
    //Get veclocity of cusor
    //Vận tốc = số điểm ảnh (px) / giây
   final float xvelocity = Math.abs(velocityX);

   //Vận tốc chuyển đổi X > 100 và khoảng cách từ điểm kéo đầu đến điểm kéo cuối > 100
   if( (xvelocity > SWIPE_MIN_VELOCITY) && (xdistance > SWIPE_MIN_DISTANCE) )
   {
        if(ev1X > ev2X)//Switch Left
        {
            previousView();
        }
        else//Switch Right
        {
            nextView();
        }
   }

    return false;
}

public void onLongPress(MotionEvent e) {

}

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {
    return false;
}

public void onShowPress(MotionEvent e) {

}

public boolean onSingleTapUp(MotionEvent e) {
    return false;
}

//Next, Previous Views
private void previousView() {
    switcher1.showPrevious();
}
private void nextView() {
    switcher1.showNext();
}

Below code the XML file.

<?xml version="1.0" encoding="utf-8"?>
  <ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/viewSwitcher1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentLeft="true"
     android:layout_alignParentTop="true" >

   <include
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     layout="@layout/list_row_main" />

   <include
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     layout="@layout/list_row_swipe" />

</ViewSwitcher>

解决方案

As I understand your question, your problem is to detect the touch gesture within the ListView, right?

Therefore, you have to extend the ListView and detect horizontal touch gestures in the onInterceptTouchEvent method.

Heres is an example of a ListView, which does not react horizontally touch events. These events will be dispatched to you child view, which is in fact your list item view that has to catch these events (use gesture listener) and trigger the ViewSwitcher.

public class SampleListView extends ListView {

.
.
.

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // reset difference values
                mDiffX = 0;
                mDiffY = 0;

                mLastX = ev.getX();
                mLastY = ev.getY();
                break;

            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                mDiffX += Math.abs(curX - mLastX);
                mDiffY += Math.abs(curY - mLastY);
                mLastX = curX;
                mLastY = curY;

                // don't intercept event, when user tries to scroll vertically
                if (mDiffX > mDiffY) {
                    return false; // do not react to horizontal touch events, these events will be passed to your list item view
                }
        }

        return super.onInterceptTouchEvent(ev);
    }

.
.
.

}

这篇关于里面的ListView滑动手势 - 机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆