商品详情页使用TabLayout+Listview

有时候需要做一些类似商品详情页的功能,一般进行多布局用来展示更多有效的信息,我就用Tablayout+ListView做个简单Demo

这里需要用到一些反射

class.getField()获取一个类的 ,public成员变量,包括基类 。
class.getDeclaredField()获取一个类的 ,所有成员变量,不包括基类
Field.setAccessible()成员变量为private,必须进行此操作。

下面就把代码贴上:

布局文件:基础的东西

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <android.support.design.widget.TabLayout
        android:id="@+id/mTablayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        >

        <android.support.design.widget.TabItem
            android:id="@+id/baobei"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="宝贝" />

        <android.support.design.widget.TabItem
            android:id="@+id/xiangqing"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="详情" />

        <android.support.design.widget.TabItem
            android:id="@+id/pinglun"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="评论" />
    </android.support.design.widget.TabLayout>

    <ListView
        android:id="@+id/mListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>

</LinearLayout>

Activity如下:

import android.os.Bundle;
import android.support.design.widget.TabItem;
import android.support.design.widget.TabLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener {

    private TabItem baobei;
    private TabItem xiangqing;
    private TabItem pinglun;
    private TabLayout mTablayout;
    private ListView mListView;
    private List<String> list=new ArrayList<>();
    private int position;

//    Activity的onCreate()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        获取控件ID
        initView();
//        添加数据及tablayout配置
        initData();
    }

    private void initData() {
        for (int i = 0; i < 90; i++) {
            list.add("Item"+i);
        }
//        listview默认适配器
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        mListView.setAdapter(adapter);
//        listview滑动监听事件(重写onSrcoll()和onScrollStateChanged()方法)
        mListView.setOnScrollListener(this);
//        获取tablayout的item
        for (int i = 0; i < mTablayout.getTabCount(); i++) {
//            循环获取tab
            TabLayout.Tab tab = mTablayout.getTabAt(i);
            if (tab == null) return;
//            通过tab对象获取该类的字节码文件
            Class c = tab.getClass();
            try {
//                class.getField()获取一个类的 ==public成员变量,包括基类== 。
//                class.getDeclaredField()获取一个类的 ==所有成员变量,不包括基类== 。
                Field field = c.getDeclaredField("mView");
//                Field.setAccessible()成员变量为private,必须进行此操作。
                field.setAccessible(true);
//                通过反射获取对象
                final View view = (View) field.get(tab);
                if (view == null) return;
                view.setTag(i);
//              对该对象做监听事件
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
//                        判断索引与listview的索引进行匹配
                        position = (int) view.getTag();
                        switch (position){
                            case 0:
                                mListView.setSelection(0);
                                break;
                            case 1:
                                mListView.setSelection(30);
                                break;
                            case 2:
                                mListView.setSelection(60);
                                break;
                        }
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    private void initView() {
        baobei = (TabItem) findViewById(R.id.baobei);
        xiangqing = (TabItem) findViewById(R.id.xiangqing);
        pinglun = (TabItem) findViewById(R.id.pinglun);
        mTablayout = (TabLayout) findViewById(R.id.mTablayout);
        mListView = (ListView) findViewById(R.id.mListView);

    }


    private int post;
//    listview滑动改变事件(通过改变list的条目来匹配tablayout的索引并更新改变)
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (post){
            case 0:
                TabLayout.Tab tab = mTablayout.getTabAt(0);
                tab.select();
                break;

            case 30:
                TabLayout.Tab tab2 = mTablayout.getTabAt(1);
                tab2.select();

                break;
            case 60:
                TabLayout.Tab tab3 = mTablayout.getTabAt(2);
                tab3.select();

                break;
            case 59:
                TabLayout.Tab tabAt2 = mTablayout.getTabAt(2);
                tabAt2.select();
                break;
            case 29:
                TabLayout.Tab tabAt = mTablayout.getTabAt(1);
                tabAt.select();
                break;

        }
    }

//    获取每一段首条目的索引并保存,方便在onScrollStateChanged()使用
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        switch (firstVisibleItem){
            case 0:
                post=0;
                break;
            case 30:
                post=30;
                break;
            case 60:
                post=60;
                break;

        }
    }


}

猜你喜欢

转载自blog.csdn.net/csdn15002274757/article/details/81190858