1. 程式人生 > >仿餓了麼,百度外賣這些App的雙ListView列表聯動效果

仿餓了麼,百度外賣這些App的雙ListView列表聯動效果

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#f9f9f9"
    android:gravity="center"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_right"
        android:layout_width="match_parent"
        android:layout_height="70px"
        android:background="@color/green"
        android:gravity="center"
        android:textColor="#333333"
        android:textSize="18sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="90dp"
        android:background="@color/white"
        android:gravity="center_vertical"
        android:orientation="horizontal" >
        <ImageView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:background="@mipmap/ic_launcher" />
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50dp"
            android:text="右邊條目"
            android:textColor="@color/textcolor"
            android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>
三、將兩個ListView放在一個佈局內,監聽左邊ListView的點選事件和右邊ListView 滾動事件 實現步驟:看註釋吧... 主介面
package ouyang.doublelist;
import android.graphics.Color;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import butterknife.Bind;
import butterknife.ButterKnife;
import oypf.doublistview.R;
public class MainActivity extends AppCompatActivity {
    String titles[] = {"蔬菜1", "水果1", "姓氏1", "蔬菜2", "水果2", "姓氏2", "蔬菜3",
            "水果3", "姓氏3", "蔬菜4", "水果4", "姓氏4", "蔬菜5", "水果5", "姓氏5"};
    String name1[] = {"蘿蔔", "大蔥", "茄子", "大蒜", "生薑", "蘿蔔", "大蔥", "茄子",
            "大蒜", "生薑", "蘿蔔", "大蔥"};
    String name2[] = {"蘋果", "梨", "香蕉", "西瓜", "橘子", "大棗", "菠蘿", "紅提", "葡萄",
            "櫻桃", "椰子"};
    String name3[] = {"鄭", "王", "伊", "荊", "湯", "王", "孫", "李", "錢", "趙",
            "祁", "韋", "巨集"};;
    @Bind(R.id.lv_left)
    ListView lvLeft;
    @Bind(R.id.lv_Right)
    PinnedHeaderListview lvRight;
    private ArrayList<DoubleListBean> lists;
    private int position;
    private LeftAdapter leftAdapter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initData();
        initView();
        initListener();
    }
    private void initData() {
        //弄點資料
        lists = new ArrayList<>();
        for (int i = 0; i < name1.length; i++) {
            lists.add(new DoubleListBean(name1[i] + 1, i, titles[0]));
        }
        for (int i = 0; i < name2.length; i++) {
            lists.add(new DoubleListBean(name2[i] + 1, i, titles[1]));
        }
        for (int i = 0; i < name3.length; i++) {
            lists.add(new DoubleListBean(name3[i] + 1, i, titles[2]));
        }
        for (int i = 0; i < name1.length; i++) {
            lists.add(new DoubleListBean(name1[i] + 2, i, titles[3]));
        }
        for (int i = 0; i < name2.length; i++) {
            lists.add(new DoubleListBean(name2[i] + 2, i, titles[4]));
        }
        for (int i = 0; i < name3.length; i++) {
            lists.add(new DoubleListBean(name3[i] + 2, i, titles[5]));
        }
        for (int i = 0; i < name1.length; i++) {
            lists.add(new DoubleListBean(name1[i] + 3, i, titles[6]));
        }
        for (int i = 0; i < name2.length; i++) {
            lists.add(new DoubleListBean(name2[i] + 3, i, titles[7]));
        }
        for (int i = 0; i < name3.length; i++) {
            lists.add(new DoubleListBean(name3[i] + 3, i, titles[8]));
        }
        for (int i = 0; i < name1.length; i++) {
            lists.add(new DoubleListBean(name1[i] + 4, i, titles[9]));
        }
        for (int i = 0; i < name2.length; i++) {
            lists.add(new DoubleListBean(name2[i] + 4, i, titles[10]));
        }
        for (int i = 0; i < name3.length; i++) {
            lists.add(new DoubleListBean(name3[i] + 4, i, titles[11]));
        }
        for (int i = 0; i < name1.length; i++) {
            lists.add(new DoubleListBean(name1[i] + 5, i, titles[12]));
        }
        for (int i = 0; i < name2.length; i++) {
            lists.add(new DoubleListBean(name2[i] + 5, i, titles[13]));
        }
        for (int i = 0; i < name3.length; i++) {
            lists.add(new DoubleListBean(name3[i] + 5, i, titles[14]));
        }
    }
    private void initView() {
        //左邊
        leftAdapter = new LeftAdapter(this);
        lvLeft.setAdapter(leftAdapter);
        //右邊
        PinnedAdapter rightAdapter = new PinnedAdapter(this);
        // 將資料來源傳遞給Listview
        rightAdapter.updateData(lists);
        lvRight.setAdapter(rightAdapter);
        //設定頭部的條目
        lvRight.setPinnedHeaderView(getHeaderView());
    }
    private View getHeaderView() {
        //頭部是個TextView,不能用view.inflate載入佈局,會測量不出寬高
        TextView itemView = new TextView(this);
        itemView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                70));
        itemView.setGravity(Gravity.CENTER);
        itemView.setBackgroundColor(getResources().getColor(R.color.green));
        itemView.setTextSize(18);
        itemView.setTextColor(Color.BLACK);
        itemView.setPadding(0, 0, 0, itemView.getPaddingBottom());
        return itemView;
    }
    private void initListener() {
        //右邊是滾動監聽
        lvRight.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
            }
            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //滾動確定替換條目
                lvRight.configureHeaderView(firstVisibleItem);
                //獲取到第一個條目的型別
                String title = lists.get(firstVisibleItem).getTitle();
                //遍歷左邊列表資料集合,獲取到當前型別的索引
                for (int i = 0; i < titles.length; i++) {
                    if (titles[i] == title) {
                        position = i;
                    }
                }
                //左邊滾動到條目
                lvLeft.smoothScrollToPosition(position);
                //改變選擇的顏色和背景
                leftAdapter.changeSelected(position);
            }
        });
        //左邊的點選監聽
        lvLeft.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                for (int j = 0; j < lists.size(); j++) {
                    //左邊當前標題和右邊標題相同時,獲取右邊的索引
                    if (titles[i] == lists.get(j).getTitle()) {
                        position = j;
                        break;
                    }
                }
                //右邊listview選擇當前條目
                lvRight.setSelection(position);
                //左邊文字的顏色和背景
                leftAdapter.changeSelected(position);
            }
        });
    }
}
DoubleListBean
package ouyang.doublelist;
/**
 * Create by oy 2017/7/27 14:14.
 */
public class DoubleListBean {
    private String name;
    private int type;// 型別 後邊要根據型別顯示標題
    private String title;
    public DoubleListBean(String name, int type, String title) {
        super();
        this.name = name;
        this.type = type;
        this.title = title;
    }
    public DoubleListBean() {
        super();
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
}

四、感謝和原始碼 原始碼地址:http://download.csdn.net/detail/zhaozhuzi/9914334