Android中listView联动效果

最近看见listView联动的效果,感觉好不错,就打算写一个,其实也很简单,无非就是一个布局中两个listView,左边的点击事件右边的做出响应,右边的滑动事件左边做出反应。大致思路就是这样,现在让我们开始吧!

首先看一下效果图吧:

这里写图片描述

MainActivity中:

package com.example.mac.listviewgangeddemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView leftLv, rightLv;
    private List leftList;
    private List<String> rightList;
    private LeftLvAdapter leftLvAdapter;
    private RightlvAdapter rightlvAdapter;


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

        leftLv = (ListView) findViewById(R.id.leftLv);
        rightLv = (ListView) findViewById(R.id.rightLv);

        leftLvAdapter = new LeftLvAdapter(this);
        rightlvAdapter = new RightlvAdapter(this);

        //设置左边的数据
        leftList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            leftList.add("左边数据  " + i);
        }
        leftLvAdapter.setList(leftList);
        //设置listView的滚动条不显示
        leftLv.setVerticalScrollBarEnabled(false);


        //设置右边的数据
        rightList = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            rightList.add("右边数据  " + i);
        }
        rightlvAdapter.setList(rightList);
        //设置listView的滚动条不显示
        rightLv.setVerticalScrollBarEnabled(false);



        //左边的点击事件
        leftLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                //当点击左边的数据的时候,右边的数据变为10倍
                rightLv.setSelection((int) l * 10);

            }
        });


        //右边的滑动监听
        rightLv.setOnScrollListener(new AbsListView.OnScrollListener() {
            //用于记录listView的滚动状态
            boolean userScrolled = false;

            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
                /*
                首先呢,ListView的滚动有三种状态
                第一是静止状态,SCROLL_STATE_IDLE
                第二是手指滚动状态,SCROLL_STATE_TOUCH_SCROLL
                第三是手指不动了,但是屏幕还在滚动状态。SCROLL_STATE_FLING
                */

                if (i == SCROLL_STATE_IDLE) {
                    userScrolled = false;
                } else {
                    userScrolled = true;
                }
            }

            /* 正在滚动
            * firstVisibleItem第一个Item的位置
            * visibleItemCount 可见的Item的数量
            * totalItemCount item的总数
            */

            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //判断listView是什么状态
                if (userScrolled) {

                    leftLv.setSelection(firstVisibleItem / 10);

                }
            }
        });


        leftLv.setAdapter(leftLvAdapter);

        rightLv.setAdapter(rightlvAdapter);

    }

}

LeftLvAdapter中:


package com.example.mac.listviewgangeddemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by mac on 16-8-17.
 */
public class LeftLvAdapter extends BaseAdapter {

    private Context context;
    private List<String> list;

    public LeftLvAdapter(Context context) {
        this.context = context;
    }

    public void setList(List<String> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        MyLeft myLeft = null;
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_left, viewGroup, false);
            myLeft = new MyLeft(view);
            view.setTag(myLeft);
        } else {
            myLeft = (MyLeft) view.getTag();
        }
        //设置数据
        myLeft.textView.setText(list.get(i));

        return view;
    }


    class MyLeft {
        private TextView textView;

        MyLeft(View itemView) {

            textView = (TextView) itemView.findViewById(R.id.item_left_tv);
        }
    }

}

RightlvAdapter中:


package com.example.mac.listviewgangeddemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by mac on 16-8-17.
 */
public class RightlvAdapter extends BaseAdapter {

    private Context context;
    private List<String> list;

    public RightlvAdapter(Context context) {
        this.context = context;
    }

    public void setList(List<String> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        MyRight myRight = null;
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_right, viewGroup, false);
            myRight = new MyRight(view);
            view.setTag(myRight);
        }else {
            myRight = (MyRight) view.getTag();
        }
        //设置数据
        myRight.textView.setText(list.get(i));

        return view;
    }

    class MyRight {
        private TextView textView;

        MyRight(View itemView) {
            textView = (TextView) itemView.findViewById(R.id.item_right_tv);
        }
    }
}

MainActivity的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context="com.example.mac.listviewgangeddemo.MainActivity">


    <ListView
        android:id="@+id/leftLv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ListView
        android:id="@+id/rightLv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

item_left:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_left_tv"
        android:layout_width="wrap_content"
        android:textSize="30sp"
        android:layout_margin="10dp"
        android:layout_height="wrap_content"
        android:text="测试" />
</LinearLayout>

item_right:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_right_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="#0ff"
        android:text="测试" />
</LinearLayout>

我们会发现如果在MainActivity中不添加if的限定,当运行程序时,listview明明没有滚动,那为什么系统会调用onScroll方法呢?但此时onScrollStateChanged并不会调用

所以我们来看看它的源码,

setOnScrollListener的源码:


/**
 * Set the listener that will receive notifications every time the list scrolls.
 * 设置监听,listView滚动的时候会接受到通知
 * @param l the scroll listener
 * 参数:l 滑动的监听
 */
public void setOnScrollListener(OnScrollListener l) {
    mOnScrollListener = l;
    invokeOnItemScrollListener();
}

setOnScrollListener里面调用了invokeOnItemScrollListener()方法,接着看invokeOnItemScrollListener方法源码:

/**
 * Notify our scroll listener (if there is one) of a change in scroll state
 * 通知我们的滑动监听(如果是1)改变滚动的状态
 */
void invokeOnItemScrollListener() {
    if (mFastScroll != null) {
        mFastScroll.onScroll(mFirstPosition, getChildCount(), mItemCount);
    }
    if (mOnScrollListener != null) {
        mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
    }
    onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these.
}

本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值