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

Android ListViewで自動的にレイアウトを表示または非表示する実現方法

ViewのOnTouchListenerインターフェースを利用してlistViewのスライドを監視し、前回の座標と比較してスライド方向を判断し、スライド方向に応じて対応するレイアウトを表示または非表示にし、アニメーションも含む

1.自動的にToolbarを表示/非表示

まずlistViewにHeaderViewを追加し、最初のアイテムが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が下にスライド
else if(mFirstY-mCurrentY>mTouchSlop)
direction=1; //listViewが上にスライド
if(direction==1)
{
if(mShow)
{
toolbarAnim(1); //上方的viewを非表示にする
mShow=!mShow;
}
}
else if(direction==0)
{
if(!mShow)
{
toolbarAnim(0); //上方的viewを表示する
mShow=!mShow;
}
}
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
}

属性アニメーション

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();
}
//上記は位移と透明度の属性アニメーションです。

使用する際には、NoActionBarのテーマを使用する必要があります。そうしないと競合が発生し、コンパイルが引き起こされます。

dependencies{
ファイルツリーをコンパイルする際には、include配列に[''を含める。*.jar',dir:'libs'
compile 'com.android.support:appcompat-v7:21.0.3'
}

2当てはめたいコンポーネントがtoolbarではなく、カスタムレイアウトのmyViewである場合、いくつかのポイントに注意する必要があります。

(1)レイアウトは相対レイアウトを使用し、カスタムレイアウトをlistViewの上に浮かべます。

(2)最初のItemがmyViewに覆われないように、listViewにHeaderViewを追加します。この時、myViewの高さを測定する必要があります。以下の方法でタスクをUIスレッドにポストする必要があります。そうしないと、実行中にエラーが発生します。

final View header=new View(this); //listViewにheadViewを追加し、最初のitemが覆われないように header.post(new Runnable() {
public void run() {
header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
}
});

その他のものはtoolbarと同じです

以上の内容は編集者が皆さんに紹介したAndroid ListViewの自動表示/非表示レイアウトの実現方法であり、皆さんに役立つことを願っています。何か疑問があれば、コメントを残してください。編集者は迅速に回答します。また、呐喊教程サイトへのサポートに感謝しています。

声明:本文の内容はインターネットから取得され、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされた内容であり、本サイトは所有権を有しない、人工的な編集は行われていない、また関連する法的責任を負いません。著作権に抵触する内容がある場合は、メールを送信して:notice#oldtoolbag.com(メールを送信する際には、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合、本サイトは即座に侵害を疑われる内容を削除します。

基本教程
おすすめ