要想实现加载ListView或者GridView控件时带有一定的加载动画,如上图所示,而不是默认的动画样式,最好借助Github上的一个成熟的开源库 — ListViewAnimatin,GitHub地址见 nhaarman/ListViewAnimations
使用起来非常简单,几步搞定;
需要添加listviewanimations_lib-core_3.1.0.jar和nineoldandroids-2.4.0.jar这两个jar包
再添加三行代码即可
所有代码如下(不包括布局):
public class ListViewAnimationActivity extends BaseActivity {
private ListView mListView;
private MyAdapter myAdapter;
private List<String> listData = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_listview_animation);
mListView = (ListView) findViewById(R.id.id_listview_animation);
listData.clear();
for(int i = 0;i<20;i++){
String title = "我是第"+(i+1)+"只小小鸟,想要飞";
listData.add(title);
}
myAdapter = new MyAdapter(listData);
// 核心代码如下
AnimationAdapter animAdapter = new MyAnimationAdapter(myAdapter);
animAdapter.setAbsListView(mListView);
// 设置动画延时加载
assert animAdapter.getViewAnimator() != null;
animAdapter.getViewAnimator().setInitialDelayMillis(300);
// 把绑定了listview适配器的AnimationAdapter设置到ListView上
mListView.setAdapter(animAdapter);
}
private class MyAdapter extends BaseAdapter {
List<String> mListData;
public MyAdapter(List<String> mListData) {
super();
this.mListData = mListData;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mListData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mListData.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if(convertView == null){
holder = new Holder();
LayoutInflater inflater = LayoutInflater.from(ListViewAnimationActivity.this);
convertView = inflater.inflate(R.layout.listview_animation_item, null);
holder.text = (TextView) convertView.findViewById(R.id.listviw_item_title);
convertView.setTag(holder);
}else{
holder = (Holder) convertView.getTag();
}
holder.text.setText(mListData.get(position));
return convertView;
}
class Holder{
TextView text;
}
}
public class MyAnimationAdapter extends AnimationAdapter {
public MyAnimationAdapter(BaseAdapter baseAdapter) {
super(baseAdapter);
// TODO Auto-generated constructor stub
}
@Override
public Animator[] getAnimators(ViewGroup parent, View view) {
// TODO Auto-generated method stub
Animator bottomInAnimator = ObjectAnimator.ofFloat(view,
"translationY", 500, 0);
Animator rightInAnimator = ObjectAnimator.ofFloat(view,
"translationX", parent.getWidth(), 0);
return new Animator[] { bottomInAnimator, rightInAnimator };
}
}
}
这里面的MyAnimationAdapter中的getAnimators可以更换成你想要的任何其他属性动画样式,而且这种动画不仅仅适用于ListView,对于GridView同样有效
ListView在部分机型上(比如努比亚)长按和点击事件同时被触发的问题,就是你为listview设置了OnItemClick和OnItemLongClick两个事件,当你长按ListView时,会先执行了长按事件里的方法(比如弹框),当你松开手后弹框是出来了,但点击事件里的方法(比如进入下一个页面)也被执行了,要想解决这种冲突,据我所知,很简单,只要把长按事件的返回值由false改为true即可,大意应该是不让事件再往下传递,仅此记录下。