ListView中条目指定位置停留和动画效果

 
 
最近查看主流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 ;
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值