最近檢視主流app練習時遇到了個挺蛋疼的布局實作,一個可以上下滑動布局滑動到指定條目時,這個條目在頂部停下來下面的條目還可以繼續滑動,
于是照貓畫虎的自己寫了個實作,當指定一個位置停留時想清除了需求其實很簡單,當條目位置确定是置頂後用另一個長相相同和這個條目相同的View覆寫就可以了.畢竟小弟剛學,對自定義控件不是特别熟練,就用了個特簡單的方法實作.
//布局
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
RelativeLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android:
layout_width
=
"match_parent"
android:
layout_height
=
"match_parent"
>
<
ListView
android:
id
=
"@+id/lv_demo"
android:
layout_width
=
"match_parent"
android:
layout_height
=
"wrap_content"
/>
<
TextView
android:
background
=
"#fff"
android:
id
=
"@+id/tv_listdemo"
android:
layout_width
=
"match_parent"
android:
layout_height
=
"wrap_content"
android:
text
=
"條目1"
android:
visibility
=
"invisible"
/>
</
RelativeLayout
>
import
java.util.ArrayList
;
import
java.util.List
;
import
android.app.Activity
;
import
android.os.Bundle
;
import
android.util.DisplayMetrics
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.view.animation.Animation
;
import
android.view.animation.Animation.AnimationListener
;
import
android.view.animation.TranslateAnimation
;
import
android.widget.AbsListView
;
import
android.widget.AbsListView.OnScrollListener
;
import
android.widget.AdapterView
;
import
android.widget.AdapterView.OnItemClickListener
;
import
android.widget.BaseAdapter
;
import
android.widget.ListView
;
import
android.widget.TextView
;
public
class
ListViewDemo
extends
Activity
{
private
ListView
lv
;
private
List
<
String
>
list
;
private
TextView
tv_demo
;
private
MyBaseAdapter
adapter
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
// TODO Auto-generated method stub
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
listdemo
);
initView
();
initData
();
initLinter
();
}
/**
* 監聽
* */
private
void
initLinter
()
{
//滑動監聽
lv
.
setOnScrollListener
(
new
OnScrollListener
()
{
@Override
public
void
onScrollStateChanged
(
AbsListView
view
,
int
scrollState
)
{
// TODO Auto-generated method stub
}
@Override
public
void
onScroll
(
AbsListView
view
,
int
firstVisibleItem
,
int
visibleItemCount
,
int
totalItemCount
)
{
//當出現在指定位置為1時顯示出來
if
(
firstVisibleItem
==
1
){
tv_demo
.
setVisibility
(
View
.
VISIBLE
);
}
else
if
(
firstVisibleItem
<
1
){
tv_demo
.
setVisibility
(
View
.
GONE
);
}
}
});
//條目監聽
lv
.
setOnItemClickListener
(
new
OnItemClickListener
()
{
@Override
public
void
onItemClick
(
AdapterView
<?>
parent
,
View
view
,
int
position
,
long
id
)
{
int
id2
=
lv
.
getSelectedItemPosition
();
System
.
out
.
println
(
id2
);
if
(
position
>
1
){
//過時的方法
//int i = getWindowManager().getDefaultDisplay().getWidth();
//替代方法:通過擷取分辨率資訊來過去寬度
DisplayMetrics
metrics
=
new
DisplayMetrics
();
getWindowManager
().
getDefaultDisplay
().
getMetrics
(
metrics
);
int
i
=
metrics
.
widthPixels
;
//從左側移動到最右側
TranslateAnimation
animation
=
new
TranslateAnimation
(
0
,
i
,
0
,
0
);
animation
.
setDuration
(
500
);
view
.
startAnimation
(
animation
);
final
int
state
=
position
;
//動畫監聽
animation
.
setAnimationListener
(
new
AnimationListener
()
{
@Override
public
void
onAnimationStart
(
Animation
animation
)
{
// TODO Auto-generated method stub
}
@Override
public
void
onAnimationRepeat
(
Animation
animation
)
{
// TODO Auto-generated method stub
}
//動畫結束
@Override
public
void
onAnimationEnd
(
Animation
animation
)
{
//删除標明條目
list
.
remove
(
list
.
get
(
state
));
//更新填充
adapter
.
notifyDataSetChanged
();
}
});
}
}
});
}
/**
* 資料填充
* */
private
void
initData
()
{
list
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
50
;
i
++)
{
list
.
add
(
"條目"
+
i
);
}
adapter
=
new
MyBaseAdapter
(
list
);
lv
.
setAdapter
(
adapter
);
}
/**
* 資料初始化
* */
private
void
initView
()
{
lv
=
(
ListView
)
findViewById
(
R
.
id
.
lv_demo
);
tv_demo
=
(
TextView
)
findViewById
(
R
.
id
.
tv_listdemo
);
}
class
MyBaseAdapter
extends
BaseAdapter
{
private
List
<
String
>
list
;
public
MyBaseAdapter
(
List
<
String
>
list
)
{
this
.
list
=
list
;
}
@Override
public
int
getCount
()
{
return
list
.
size
();
}
@Override
public
Object
getItem
(
int
position
)
{
// TODO Auto-generated method stub
return
null
;
}
@Override
public
long
getItemId
(
int
position
)
{
// TODO Auto-generated method stub
return
0
;
}
@Override
public
View
getView
(
int
position
,
View
convertView
,
ViewGroup
parent
)
{
if
(
convertView
==
null
){
convertView
=
View
.
inflate
(
ListViewDemo
.
this
,
R
.
layout
.
item_lv_main
,
null
);
}
TextView
view
=
(
TextView
)
convertView
.
findViewById
(
R
.
id
.
tv_item
);
view
.
setText
(
list
.
get
(
position
));
return
convertView
;
}
}
}