`

多个listview进行滑动切换效果

阅读更多
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ViewFlipper;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TableLayout.LayoutParams;

public class MainActivity extends Activity {

private ViewFlipper mVf;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mVf = new ViewFlipper(this);
        mVf.setLongClickable(true);
        mVf.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
       
        TextView tv = new TextView(this);
        tv.setText("TextView 1");
        tv.setBackgroundColor(0xffffffff);
        mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        TextView tv1 = new TextView(this);
        tv1.setText("TextView 2");
        tv1.setBackgroundColor(0xffffffff);
        mVf.addView(tv1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        ListView lv = new GestureListView(this);
        lv.setBackgroundColor(0xff808080);
        final String[] items = {"one", "two", "three", "four", "five", "six", "sevent", "eight", "nine"};
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
        lv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
        lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(MainActivity.this).setMessage(items[arg2]).create().show();
}
});
        registerForContextMenu(lv);
        mVf.addView(lv,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        ListView lv1 = new GestureListView(this);
        lv.setBackgroundColor(0xff808040);
        final String[] items1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items1));
        lv1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
        lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(MainActivity.this).setMessage(items[arg2]).create().show();
}
});
        registerForContextMenu(lv1);
        mVf.addView(lv1,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        setContentView(mVf);
    }
   
   
       
private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//left
Log.i("GestureDemo", "ViewFlipper left");
mVf.showNext();
return true;
}else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//right
Log.i("GestureDemo", "ViewFlipper right");
mVf.showPrevious();
return true;
}
return false;
}
   
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

return false;
}

@Override
public void onLongPress(MotionEvent e) {

}

@Override
public boolean onDown(MotionEvent e) {
return false;
}
});  

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    menu.add("Menu 1");
    menu.add("Menu 2");
    menu.add("Menu 3");
super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
System.out.println("View " + info.position + " context menu activited.");
return super.onContextItemSelected(item);
    }

class GestureListView extends ListView {

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

@Override
public boolean onTouchEvent(MotionEvent ev) {
if(mLvDetector.onTouchEvent(ev)) return true;
return super.onTouchEvent(ev);
}

private GestureDetector mLvDetector = new GestureDetector(new OnGestureListener() {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

@Override
public boolean onDown(MotionEvent e) {
int position = pointToPosition((int)e.getX(), (int)e.getY());
if( position != ListView.INVALID_POSITION) {
View child = getChildAt(position - getFirstVisiblePosition());
if(child != null) child.setPressed(true);
}
return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//left
Log.i("GestureDemo", "ListView left");
mVf.showNext();
return true;
}else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//right
Log.i("GestureDemo", "ListView right");
mVf.showPrevious();
return true;
}
return false;
}

@Override
public void onLongPress(MotionEvent e) {
System.out.println("Listview long press");
int position = pointToPosition((int)e.getX(), (int)e.getY());
if( position != ListView.INVALID_POSITION) {
View child = getChildAt(position - getFirstVisiblePosition());
if(child != null) GestureListView.this.showContextMenuForChild(child);
}
}

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

@Override
public void onShowPress(MotionEvent e) {

}

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

});
}
}
分享到:
评论

相关推荐

    带有listview界面的滑动切换activity

    在Android应用开发中,"带有listview界面的滑动切换activity"是一种常见的交互设计,它提高了用户在多个页面间切换的便捷性。这种设计通常利用手势识别技术,特别是左右滑动手势,来实现Activity之间的平滑过渡。在...

    listview的item滑动效果

    标题中提到的"listview的item滑动效果"通常指的是Item的侧滑或者滑动显示/隐藏更多操作,比如常见的滑动删除、滑动切换状态等。为了实现这样的效果,我们可以使用滑动布局(SlidingLayout)或者SwipeRefreshLayout等...

    Android listView选项滑动效果

    `Android listView选项滑动效果`是指通过增强ListView的功能,使每个列表项可以左右滑动,通常用于实现更多的交互操作,比如滑动删除、切换状态等。这个描述提及的demo是基于`android-swipelistview-master`库,它为...

    关于多个ListView与ScrollView滑动冲突的一个简单处理方法

    本文将详细讲解如何解决多个ListView与ScrollView滑动冲突的简单处理方法。 首先,理解冲突的本质:ScrollView是一个可以容纳多个View的容器,它可以垂直滚动。而ListView本身就是可滚动的列表,内部已经处理了滑动...

    viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页

    标题"viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页"描述的就是这样一个功能:在ViewPager中嵌套了一个ListView,ListView支持滑动删除,而当滑动到ListView之外的区域时,...

    listview的滑动特效

    ListView是Android平台上...综上所述,实现ListView的滑动特效涉及多个方面,包括自定义动画、适配器、监听器以及第三方库的使用。通过巧妙地组合和定制这些元素,可以创造出各种酷炫的滑动效果,提升应用的用户体验。

    android 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)

    在Android开发中,实现类似QQ滑动界面的效果通常涉及到`ViewPager`组件的使用,它可以创建一个可以左右滑动切换的页面容器。在这个场景下,我们不仅要实现`ViewPager`的滑动,还要在每个`ViewPager`的页面中嵌入`...

    仿美团外卖两个ListView联动,左边点击切换右边,右边滑动切换左边

    5. **标题切换**: 在右侧ListView滑动时,顶部应显示当前分类的标题。这可以通过在布局中添加TextView,并在滑动监听器中更新其文本来实现。 6. **联动逻辑**: 这是实现联动的关键。你需要维护一个全局变量来保存...

    listview横向滑动首例不动

    然而,当你尝试让ListView实现横向滑动时,可能会遇到一个需求:在滑动过程中,第一条数据(首例)始终保持固定,就像股票或基金应用中显示的那样。这种效果可以提供更好的用户体验,让用户在浏览时始终能看到关键...

    tabhost listview 左右滑动实现

    `ViewPager`是一个可以左右滑动查看多个页面的组件,非常适合用来切换`TabHost`的标签页。 首先,引入`ViewPager`和`PagerAdapter`的依赖: ```xml dependencies { implementation 'androidx.viewpager:viewpager...

    ListView滑动控件(一)(修正版)

    总的来说,“ListView滑动控件(一)(修正版)”涵盖了Android开发中增强ListView交互性的多个方面,包括但不限于侧滑删除、上滑加载更多、性能优化和自定义动画。开发者通过深入理解和应用这些技术,可以为用户...

    ListView嵌套GridView实现左右滑动的效果

    ViewPager可以创建一个可滑动的页面集合,用户可以通过手势左右滑动切换页面,适合于展示多个相似内容的场景。HorizontalScrollView则提供了一个水平方向的滚动视图,它可以包含一个或多个水平排列的子视图。在这个...

    含有折叠列表功能界面侧滑功能以及多个listview的滑动界面点击tab实现界面切换

    3. 多个listview的滑动界面:Listview是一种在Android和iOS等平台上常用的视图组件,用于显示一串可滚动的项目列表。在应用中使用多个listview,可能表示不同的内容区域或数据集,用户可以通过滑动来浏览和交互。 4...

    上下拉listview嵌套轮播图,滑动时轮播图跟着一起滑动

    ViewPager可以展示多个页面,并且支持左右滑动切换,非常适合用来做轮播图。为了实现轮播,我们可以添加一个定时器,每隔一段时间自动切换到下一个页面,也可以监听滑动事件,当用户滑动时立即切换页面。 现在,将...

    android一个Activity中,多个listView的联动问题

    在Android开发中,有时我们需要在一个Activity中展示多个ListView,这些ListView可能会有联动效果,即一个ListView的操作会影响另一个ListView的显示。这种需求常见于数据分类、筛选或者多维度展示的场景。本篇将...

    Google Plus ListView 标签页滑动效果

    这个效果通常涉及到多个ListView或者RecyclerView的切换,通过滑动标签来展示不同的内容区域。下面我们将详细探讨这个效果实现的关键知识点。 首先,我们来看看“标签页”(Tab)的概念。在Android应用中,标签页是...

    Android仿淘宝一个Activity实现多个ListView

    为了实现多个ListView的上下滑动,我们需要在Activity中添加多个ListView,并通过监听滑动事件来切换它们。例如,可以使用OnTouchListener监听滑动方向,并在滑动到底部时加载下一个ListView。同时,还需要注意...

    listview的滑动删除编辑和长按切换位置

    这个项目可能包含了一个自定义的ListView子类,实现了滑动删除和长按切换位置的逻辑,同时可能还有对应的布局文件和适配器代码。开发者可以参考该项目的源码,学习如何处理触摸事件、动画效果以及数据与视图的同步。...

    Android应用源码之仿QQ消息列表(ListView)滑动删除效果源码.zip

    开发者通常需要自定义一个ListView的Adapter,并且重写onTouchEvent()方法,来监听用户的滑动操作。当检测到滑动事件时,可以启动一个滑动动画,使Item呈现出可删除的状态。 3. **GestureDetector**: ...

    Android 卡片式滑动切换的ListView 源码

    总的来说,"Android 卡片式滑动切换的ListView 源码"是一个涉及到Android UI组件深度定制的项目,它展示了如何将ListView、ViewPager和自定义布局结合,实现类似安卓5.0任务管理器的卡片效果。通过对源码的学习,...

Global site tag (gtag.js) - Google Analytics