最近看见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.
}
本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!