6步輕松實(shí)現(xiàn)兩個(gè)listView聯(lián)動(dòng)效果
看了網(wǎng)上更新的好多聯(lián)動(dòng)demo,感覺(jué)寫(xiě)的不是很簡(jiǎn)潔(表示不知道他們?cè)谡f(shuō)什么)
自己寫(xiě)了一個(gè)簡(jiǎn)單的Demo分享給大家- -!
效果圖:

直接上車,少說(shuō)廢話!
所用到以下的這幾個(gè)依賴,直接粘到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.定義首頁(yè)的布局文件
<?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{
/**
* 右側(cè)電影列表的接口
* http://app.vmoiver.com/apiv3/post/getPostInCate?cateid=0&p=1
*/
private ListView mLeft;
private ListView mRight;
private RightAdapter rightAdapter;
private LeftAdapter adapter;
//記錄滑動(dòng)的ListView 滑動(dòng)的位置
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 {
//可以使用參數(shù)的拼接,實(shí)現(xiàn)分頁(yè)的加載,簡(jiǎn)單的Demo就不搞那么復(fù)雜了
@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;
}
}
}
然后就沒(méi)有然后了,6個(gè)步驟寫(xiě)完了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 仿餓了嗎點(diǎn)餐界面兩個(gè)ListView聯(lián)動(dòng)效果
- 仿餓了嗎點(diǎn)餐界面ListView聯(lián)動(dòng)的實(shí)現(xiàn)
- Android中使用開(kāi)源框架Citypickerview實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)選擇
- Android自定義WheelView地區(qū)選擇三級(jí)聯(lián)動(dòng)
- Android省市區(qū)三級(jí)聯(lián)動(dòng)控件使用方法實(shí)例講解
- android-wheel控件實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果
- Android仿eleme點(diǎn)餐頁(yè)面二級(jí)聯(lián)動(dòng)列表
- Android使用android-wheel實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)
- Android實(shí)現(xiàn)兩個(gè)ScrollView互相聯(lián)動(dòng)的同步滾動(dòng)效果代碼
- Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框 下拉列表spinner的實(shí)例代碼
相關(guān)文章
Android基礎(chǔ)知識(shí)之broadcast廣播詳解
這篇文章主要為大家詳細(xì)介紹了Android基礎(chǔ)知識(shí)之broadcast廣播的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06
簡(jiǎn)單實(shí)現(xiàn)Android繪圖板
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)Android繪圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Input系統(tǒng)之InputReader處理合成事件詳解
這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理合成事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn))
這篇文章主要介紹了Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn)),本文分別給出C#和Java版的運(yùn)行效果及實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放功能的示例代碼
這篇文章主要介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法,涉及Android針對(duì)按鈕元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-11-11
Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)滑動(dòng)按鈕功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android實(shí)現(xiàn)滑動(dòng)按鈕的功能、布局及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-02-02

