相信大家在日常開發(fā)過程中有遇到過類似的需求,ViewPager+Header ,ViewPager里面有ListView或者ScrollerView,這個(gè)界面如果我們自己來實(shí)現(xiàn)的話承二,需要處理各種手勢(shì)沖突查牌,還是挺麻煩的师痕,之前看過鴻洋大大寫過一篇解決這個(gè)問題的博文躲舌,Android 自定義控件 輕松實(shí)現(xiàn)360軟件詳情頁 ,本篇文章說的是如何通過系統(tǒng)控件實(shí)現(xiàn)這個(gè)效果贷掖。
這里使用的系統(tǒng)控件是CoordinatorLayout嫡秕、AppBarLayout、ViewPager苹威、PagerTabStrip昆咽。
MainActivity
package com.sundroid.coordinator.view;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager view_pager;
private List<String> titles = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view_pager = (ViewPager) findViewById(R.id.view_pager);
titles.add("簡(jiǎn)介");
titles.add("評(píng)價(jià)");
titles.add("相關(guān)");
List<Fragment> fragments = new ArrayList<>();
fragments.add(ListFragment.newInstance());
fragments.add(ListFragment.newInstance());
fragments.add(ListFragment.newInstance());
ViewPagerAdapter mAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);
view_pager.setAdapter(mAdapter);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
}
ListFragment
package com.sundroid.coordinator.view;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by sundroid on 16/05/2017.
*/
public class ListFragment extends Fragment {
private View mRootView;
private ListView listview;
private String[] name = {"Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World",
"Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World",
"Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World",
"Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World",
"Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World", "Hello World"};
static ListFragment newInstance() {
ListFragment f = new ListFragment();
return f;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.view_page_item_1, null);
}
listview = (ListView) mRootView.findViewById(R.id.listview);
listview.setNestedScrollingEnabled(true);
List<Map<String, Object>> listems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < name.length; i++) {
Map<String, Object> listem = new HashMap<String, Object>();
listem.put("name", name[i]);
listems.add(listem);
}
SimpleAdapter simplead = new SimpleAdapter(getActivity(), listems,
R.layout.list_item, new String[]{"name"},
new int[]{R.id.name});
listview.setAdapter(simplead);
//緩存的rootView需要判斷是否已經(jīng)被加過parent, 如果有parent需要從parent刪除,要不然會(huì)發(fā)生這個(gè)rootview已經(jīng)有parent的錯(cuò)誤掷酗。
ViewGroup parent = (ViewGroup) mRootView.getParent();
if (parent != null) {
parent.removeView(mRootView);
}
return mRootView;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:splitMotionEvents="false">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="300dp"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="軟件介紹"
android:textColor="#ffffff" />
</RelativeLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never">
<android.support.v4.view.PagerTabStrip
android:layout_width="match_parent"
android:layout_height="48dp" />
</android.support.v4.view.ViewPager>
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>
需要注意的是滑動(dòng)的View需要設(shè)置listview.setNestedScrollingEnabled(true)调违,否則滑動(dòng)會(huì)失效。這里只介紹用法泻轰,不涉及原理技肩,有任何疑問的同學(xué)可以留言,接下來會(huì)寫一篇關(guān)于CoordinatorLayout實(shí)現(xiàn)原理的文章浮声,敬請(qǐng)關(guān)注虚婿。