1. 使用TabLayout + ViewPager
佈局
<com.google.android.material.tabs.TabLayout
android:id="@+id/invest_tablayout"
android:layout_width="match_parent"
android:layout_height="80dp"
android:paddingTop="20dp"
android:background="@color/color_white"
app:tabIndicatorColor="@color/colorPrimary"
app:tabIndicatorFullWidth="false"
app:tabSelectedTextColor="@color/colorPrimary"
app:tabTextAppearance="@style/tab_text_size" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/invest_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
使用
mFragments.clear();
investTablayout.removeAllTabs();
String[] arr = getResources().getStringArray(R.array.tab);
mFragments.add(new PersonListFragment());
mFragments.add(new PersonAddFragment());
mFragments.add(new PersonFindFragment());
for (int i = 0; i < arr.length; i++) {
investTablayout.addTab(investTablayout.newTab());
}
investTablayout.setupWithViewPager(investViewpager, false);
mainViewPagerAdapter = new MainViewPagerAdapter(getSupportFragmentManager(), mFragments);
investViewpager.setAdapter(mainViewPagerAdapter);
for (int i = 0; i < arr.length; i++) {
investTablayout.getTabAt(i).setText(arr[i]);
}
adapter
public class MainViewPagerAdapter extends FragmentPagerAdapter {
private List<BaseFragment> mFragments;
public MainViewPagerAdapter(FragmentManager fm, List<BaseFragment> cmFragments) {
super(fm);
mFragments = cmFragments;
}
@Override
public Fragment getItem(int i) {
return mFragments.get(i);
}
@Override
public int getCount() {
return mFragments.size();
}
}
2. 查詢顯示動態列表
這周還做了一個人員信息查詢功能,按照輸入的字符來動態更新列表
fpfFindEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() == 0) {
fpfFindClear.setVisibility(View.INVISIBLE);
} else {
fpfFindClear.setVisibility(View.VISIBLE);
}
handler.post(runnable);
}
});
3. 學習了一個彈性的自定義ScrollerView
public class ReboundScrollView extends ScrollView {
@SuppressWarnings("unused")
private static final String TAG = "ReboundScrollView";
//移動的延遲距離因子,手如果滑動100 ,實際滑動60
private static final float MOVE_FACTOR = 0.6f;
//動畫執行的時間,也就是恢復正常的時間
private static final int ANIM_TIME = 400;
//ScrollView的唯一子view
private View contentView;
//手指觸摸起始y座標
private float startY;
//用來保存原始位置
private Rect originalRect = new Rect();
//表示是否正在移動
private boolean isMoved = false;
public ReboundScrollView(Context context) {
super(context);
}
public ReboundScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ReboundScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* descirption: 當我們的XML佈局被加載完後,就會回調onFinshInfalte這個方法,在這個方法中我們可以初始化控件和數據。
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (getChildCount() > 0) {
contentView = getChildAt(0);
}
}
/**
* descirption: 在測量完成之後,佈局的時候調用此方法,去保存原始位置
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (contentView == null)
return;
//保存原始位置
originalRect.set(contentView.getLeft(), contentView.getTop(), contentView.getRight(), contentView.getBottom());
}
/**
* descirption: 事件分發的方法
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (contentView == null) {
return super.dispatchTouchEvent(ev);
}
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "dispatchTouchEvent: ACTION_DOWN");
startY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "dispatchTouchEvent: ACTION_MOVE");
if (!isCanPullDown() && !isCanPullUp()) {
startY = ev.getY();
break;
}
float nowY = ev.getY();
int deltaY = (int) (nowY - startY);
boolean shouldMove = (isCanPullDown() && deltaY > 0)
|| (isCanPullUp() && deltaY < 0)
|| (isCanPullDown() && isCanPullUp());
if (shouldMove) {
int offset = (int) (deltaY * MOVE_FACTOR);
contentView.layout(originalRect.left, originalRect.top + offset, originalRect.right,
originalRect.bottom + offset);
isMoved = true;
}
break;
case MotionEvent.ACTION_UP: //鬆手就恢復原來的位置\
Log.d(TAG, "dispatchTouchEvent: ACTION_UP");
if (!isMoved)
break;
TranslateAnimation anim = new TranslateAnimation(0, 0, contentView.getTop(), originalRect.top);
anim.setDuration(ANIM_TIME);
anim.setInterpolator(new DecelerateInterpolator());
contentView.startAnimation(anim);
contentView.layout(originalRect.left, originalRect.top, originalRect.right, originalRect.bottom);
isMoved = false;
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
private boolean isCanPullDown() {
return getScrollY() == 0 || contentView.getHeight() <= getHeight() + getScrollY();
}
private boolean isCanPullUp() {
return contentView.getHeight() <= getHeight() + getScrollY();
}
}