6步轻松实现两个listView联动效果

看了网上更新的好多联动demo,感觉写的不是很简洁(表示不知道他们在说什么)

自己写了一个简单的Demo分享给大家- -!

效果图:

直接上车,少说废话!

所用到以下的这几个依赖,直接粘到Build.gradle文件中

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'io.reactivex:rxjava:1.2.7'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0' 

1.定义首页的布局文件

<?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:id="@+id/activity_main"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.twolist.MainActivity"> 

  <ListView
    android:id="@+id/left"
    android:layout_width="88dp"
    android:background="#eaebec"
    android:layout_height="match_parent" />
  <ListView
    android:id="@+id/right"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /> 

</LinearLayout>

2.MainActivity.java

package com.example.twolist; 

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

import com.example.twolist.adapters.LeftAdapter;
import com.example.twolist.adapters.RightAdapter; 

import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers; 

public class MainActivity extends AppCompatActivity{
  /**
   * 右侧电影列表的接口
   * http://app.vmoiver.com/apiv3/post/getPostInCate?cateid=0&p=1
   */
  private ListView mLeft;
  private ListView mRight;
  private RightAdapter rightAdapter;
  private LeftAdapter adapter; 

  //记录滑动的ListView 滑动的位置
  private int scrollPosition = -1; 

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

  private void getData() { 

    Retrofit retrofit = new Retrofit.Builder()
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("http://app.vmoiver.com").build();
    ApiService apiService = retrofit.create(ApiService.class);
    Observable<ParaseData> apiServiceMovieList = apiService.getMovieList();
    apiServiceMovieList.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<ParaseData>() {
          @Override
          public void onCompleted() { 

          } 

          @Override
          public void onError(Throwable e) { 

          } 

          @Override
          public void onNext(ParaseData paraseData) {
            rightAdapter.addRes(paraseData.getData());
          }
        }); 

  } 

  private void initView() {
    mLeft = (ListView) findViewById(R.id.left);
    mRight = (ListView) findViewById(R.id.right); 

    adapter = new LeftAdapter(this);
    mLeft.setAdapter(adapter); 

    rightAdapter = new RightAdapter(this, null);
    mRight.setAdapter(rightAdapter);
    mLeft.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        adapter.setSelectItem(position); 

        mRight.setSelection(position); 

      }
    });
    mRight.setOnScrollListener(new AbsListView.OnScrollListener() { 

      @Override
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

        if (scrollPosition != firstVisibleItem) {
          adapter.setSelectItem(firstVisibleItem);
          mLeft.setSelectionFromTop(firstVisibleItem, 40);
          scrollPosition = firstVisibleItem;
        } 

      }
    }); 

  } 

}

3.左边ListView的适配器

package com.example.twolist.adapters; 

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

import com.example.twolist.R; 

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

/**
 * Created by ALong on 2017/4/5.
 */ 

public class LeftAdapter extends BaseAdapter { 

  List<String> data;
  LayoutInflater inflater;
  private int selectItem=0; 

  public void setSelectItem(int selectItem) {
    this.selectItem = selectItem;
    notifyDataSetChanged();
  } 

  public LeftAdapter(Context context) {
    data=new ArrayList<>();
    for (int i = 0; i < 10; i++) {
      data.add("电影"+i);
    }
    inflater=LayoutInflater.from(context);
  } 

  @Override
  public int getCount() {
    return data!=null?data.size():0;
  } 

  @Override
  public String getItem(int position) {
    return data.get(position);
  } 

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

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
      convertView=inflater.inflate(R.layout.left_item,parent,false);
      holder=new ViewHolder(convertView);
      convertView.setTag(holder);
    }else {
      holder= (ViewHolder) convertView.getTag();
    } 

    holder.mText.setText(data.get(position)); 

    if (selectItem == position) {
      holder.mText.setTextColor(Color.BLUE);
      holder.mIndicator.setVisibility(View.VISIBLE);
    }else {
      holder.mText.setTextColor(Color.BLACK);
      holder.mIndicator.setVisibility(View.INVISIBLE);
    } 

    return convertView;
  } 

  public static class ViewHolder{ 

    TextView mText;
    View mIndicator; 

    public ViewHolder(View itemView) {
      mText= (TextView) itemView.findViewById(R.id.left_text);
      mIndicator=itemView.findViewById(R.id.left_indicator);
    }
  } 

}

4.右边ListView的适配器

package com.example.twolist.adapters; 

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

import com.example.twolist.ParaseData;
import com.example.twolist.R;
import com.squareup.picasso.Picasso; 

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

/**
 * Created by ALong on 2017/4/5.
 */ 

public class RightAdapter extends BaseAdapter { 

  List<ParaseData.DataBean> data;
  LayoutInflater inflater;
  Context context; 

  public RightAdapter(Context context, List<ParaseData.DataBean> data) {
    this.context=context;
    inflater = LayoutInflater.from(context);
    if (data != null) {
      this.data=data;
    }else {
      this.data=new ArrayList<>();
    }
  }
  public void addRes(List<ParaseData.DataBean> data){
    if (data != null) {
      this.data.clear();
      this.data.addAll(data);
      notifyDataSetChanged();
    }
  } 

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

  @Override
  public ParaseData.DataBean getItem(int position) {
    return data.get(position);
  } 

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

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
      convertView = inflater.inflate(R.layout.right_item, parent, false);
      holder = new ViewHolder(convertView);
      convertView.setTag(holder);
    } else {
      holder= (ViewHolder) convertView.getTag();
    } 

    holder.mTitle.setText(getItem(position).getTitle());
    holder.mMsg.setText(getItem(position).getTitle());
    Picasso.with(context).load(getItem(position).getImage()).into(holder.mImg); 

    return convertView;
  } 

  public static class ViewHolder {
    ImageView mImg;
    TextView mTitle;
    TextView mMsg; 

    public ViewHolder(View itemView) {
      mImg = (ImageView) itemView.findViewById(R.id.right_img);
      mTitle = (TextView) itemView.findViewById(R.id.right_text);
      mMsg = (TextView) itemView.findViewById(R.id.right_msg);
    }
  }
}

5.Retrofit解析的接口文件

package com.example.twolist; 

import retrofit2.http.GET;
import rx.Observable; 

/**
 * Created by ALong on 2017/4/5.
 */ 

public interface ApiService { 

//可以使用参数的拼接,实现分页的加载,简单的Demo就不搞那么复杂了
  @GET("/apiv3/post/getPostInCate?cateid=0&p=1")
  Observable<ParaseData> getMovieList();
}

6.Gson解析需要使用的类吐舌头

package com.example.twolist; 

import java.util.List; 

/**
 * Created by ALong on 2017/4/5.
 */ 

public class ParaseData { 

  private List<DataBean> data; 

  public List<DataBean> getData() {
    return data;
  } 

  public void setData(List<DataBean> data) {
    this.data = data;
  } 

  public static class DataBean { 

    private String title;
    private String image; 

    public String getTitle() {
      return title;
    } 

    public void setTitle(String title) {
      this.title = title;
    } 

    public String getImage() {
      return image;
    } 

    public void setImage(String image) {
      this.image = image;
    }
  }
}

然后就没有然后了,6个步骤写完了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中使用开源框架Citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省市区的xml文件,思路很简单,但是代码量相对大了些.偶然期间发现了另外一个开源组件,也就是今天要介绍的citypickerview. github地址:crazyandcoder/citypicker 2. 实现效果 下面给大家演示下实现效果: 3.   实现方法 (1)添加依赖 dependenc

  • Android省市区三级联动控件使用方法实例讲解

    最近有需求需要实现省市区三级联动,但是发现之前的实现不够灵活,自己做了一些优化.为了方便以后使用,抽离出来放在了github上WheelView.同时把其核心库放在了JCenter中了,可以直接引用.也可以参考项目中的Demo进行引用 下面介绍一下如何使用 如果用的是AndroidStudio那么直接在build.gradle文件中添加依赖: dependencies { compile 'chuck.WheelItemView:library:1.0.1' } 成功引入库之后,可以在需要弹出省

  • Android仿eleme点餐页面二级联动列表

    本周末外卖点得多,就仿一仿"饿了么"好了.先上图吧,这样的订单页面是不是很眼熟: 右边的listview分好组以后,在左边的Tab页建立索引.可以直接导航,是不是很方便.关键在于右边滑动,左边也会跟着滑:而点击左边呢,也能定位右边的项.它们存在这样一种特殊的交互.像这种联动的效果,还有些常见的例子呢,比如知乎采用了常见的toolbar+viewPager的联动,只不过是上下布局: 再看看点评,它的城市选择页面也有这种联动的影子,只是稍微弱一点.侧边栏可以对listview进行索引,这最

  • Android自定义WheelView地区选择三级联动

    本文实例为大家分享了WheelView地区选择三级联动的具体代码,供大家参考,具体内容如下 1. 效果 最近需要做一个地区选择的功能,但是在网上和github上找了很久都没找到满意的,然后朋友推荐了一个给我,我花了点时间把代码大致看懂并改成我想要的,并写上我的理解.效果如图: 2. 注意 a. 首先我们要明白,网上这写三级联动的demo,不管是把数据库文件放在raw还是assets中,我们都要进行复制,将这个文件复制到app目录下,即 /data/data/"+context.getPackag

  • Android使用android-wheel实现省市县三级联动

    今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为是Andriod内置的控件,google一把,发现是个github上的一个控件. 下载地址:https://code.google.com/p/android-wheel/    发现很适合做省市县三级联动就做了一个. 先看下效果图: 1.首先导入github上的wheel项目 2.新建个项目,然后选择记得右键->Properties->Android中将wheel添加为lib: 上面两个步骤是导入所有开源项目的过程了

  • 仿饿了吗点餐界面两个ListView联动效果

    如图是效果图 是仿饿了的点餐界面 1.点击左侧的ListView,通过在在适配器中设置Item来改变颜色,再通过notifyDataSetInvalidated来刷新并用lv_home.setSelection(showTitle.get(arg2));来关联右侧的 2.右侧的主要是重写下onScroll的方法:来改变左侧ListView的颜色及背景 不过程序中还有个问题,望大神解答就是我右侧的ListView下拉时,上面的TextView能改变:但是上拉时,TextView的不能及时改变应为滑

  • Android实现三级联动下拉框 下拉列表spinner的实例代码

    主要实现办法:动态加载各级下拉值的适配器 在监听本级下拉框,当本级下拉框的选中值改变时,随之修改下级的适配器的绑定值              XML布局: 复制代码 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_w

  • 仿饿了吗点餐界面ListView联动的实现

    在上篇文章给大家介绍了仿饿了吗点餐界面两个ListView联动效果 主要实现了2个ListView怎样实现互相关联,正好上篇博客review了ListView控件常规使用,因此本篇博客主要对大神的那篇博客的实现进行代码层的剖析. 一方面,方便自己,在以后的代码实现上加以参考.另一方面,供刚入门的Android菜鸟们共同学习. 二.最终的效果图 如上图效果图为仿饿了么点餐界面的ListView级联 三.实现ListView级联的困难点 为了好做区分,在本文中左侧的ListView称之为MenuLi

  • android-wheel控件实现三级联动效果

    本文实例为大家分享了android wheel省市县三级联动效果,供大家参考,具体内容如下 在github上面有一个叫做 Android-wheel 的开源控件, 代码地址:https://github.com/maarek/android-wheel 源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidCascadeMaster(jb51.net).rar 主界面布局 activity_main.xml <LinearLayout xmlns:

  • Android实现两个ScrollView互相联动的同步滚动效果代码

    本文实例讲述了Android实现两个ScrollView互相联动的同步滚动效果代码.分享给大家供大家参考,具体如下: 最近在做一个项目,用到了两个ScrollView互相联动的效果,简单来说联动效果意思就是滑动其中的一个ScrollView另一个ScrollView也一同跟着滑动,要做到一起同步滑动.感觉在以后的项目开发中大家可能也会用到,绝对做个Demo分享出来,供大家一起学习,以便大家以后好用,觉的不错,有用的可以先收藏起来哦! 其实对于ScrollView,Android官方并没有提供相关

随机推荐