有时候需要做一些类似商品详情页的功能,一般进行多布局用来展示更多有效的信息,我就用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;
}
}
}