English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android ListView自动显示隐藏布局的实现方法

借助View的OnTouchListener接口来监听listView的滑动,通过比较与上次坐标的大小,判断滑动方向,并通过滑动方向来判断是否需显示或者隐藏对应的布局,并且带有动画效果。

1.自动显示隐藏Toolbar

首先给listView增加一个HeaderView,避免第一个Item被Toolbar遮挡。

View header=new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT,
(int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
mListView.addHeaderView(header); 
//R.dimen.abc_action_bar_default_height_material为系统ActionBar的高度

定义一个mTouchSlop变量,获取系统认为的最低滑动距离

mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop(); //系统认为的最低滑动距离 

判断滑动事件

bbsListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) 
{
case MotionEvent.ACTION_DOWN:
mFirstY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentY = event.getY();
if(mCurrentY - mFirstY > mTouchSlop)
direction = 0; // ListView scrolls down
else if(mFirstY - mCurrentY > mTouchSlop)
direction = 1; // ListView scrolls up
if(direction == 1)
{
if(mShow)
{
toolbarAnim(1); // Hide the view above
mShow = !mShow;
}
}
else if(direction == 0)
{
if(!mShow)
{
toolbarAnim(0); // Show the view above
mShow = !mShow;
}
}
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
}

Property animation

protected void toolbarAnim(int flag) 
{
if(set != null && set.isRunning())
{
set.cancel();
}
if(flag == 0)
{
mAnimator1 = ObjectAnimator.ofFloat(mToolbar, 
"translationY", linearView.getTranslationY(), 0);
mAnimator2 = ObjectAnimator.ofFloat(mToolbar, "alpha", 0f, 1f);
}
else if(flag == 1)
{
mAnimator1 = ObjectAnimator.ofFloat(mToolbar, 
"translationY", linearView.getTranslationY(), -linearView.getHeight());
mAnimator2 = ObjectAnimator.ofFloat(mToolbar, "alpha", 1f, 0f);
}
set = new AnimatorSet();
set.playTogether(mAnimator1, mAnimator2);
set.start();
}
//Above is the translation and transparency attribute animation

When using, the theme must be NoActionBar to avoid conflicts. At the same time, compile

dependencies{
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.3'
}

2. Quando il componente da nascondere e visualizzare non è toolbar, ma il nostro layout personalizzato myView, ci sono alcuni punti da notare

(1) Il layout deve utilizzare il layout relativo, in modo che il nostro layout personalizzato sospenda sopra il listView.

(2) Per evitare che il primo Item venga oscurato da myView, aggiungi un HeaderView al listView. In questo caso, è necessario misurare l'altezza di myView, utilizzare il seguente metodo per postare il task sulla UI thread, altrimenti l'esecuzione potrebbe fallire.

final View header=new View(this); //Aggiungi un headView al listView per evitare che il primo item venga oscurato header.post(new Runnable() {
public void run() {
header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
}
});

Altri sono come toolbar

Il metodo di implementazione dell'auto-visualizzazione e dell'auto-nascondimento del layout di Android ListView descritto sopra è stato presentato dall'autore agli utenti. Spero che sia utile per tutti. Se avete qualsiasi domanda, lasciate un commento e l'autore risponderà tempestivamente. In questo senso, ringrazio anche tutti i sostenitori del sito Web Yell Education!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è della proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.