listview乱跳问题:最后状态正确,就是执行动画过程有问题,点击某一个条目中的展开全文按钮,其它的条目也都会走一下动画展开一下,随后又恢复。但最后好、状态都是正确的。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder vh;
if(convertView==null){
convertView = View.inflate(mActivity, R.layout.list_item_goddessay, null);
vh = new ViewHolder(convertView);
convertView.setTag(vh);
}else {
vh = (ViewHolder) convertView.getTag();
}
final GoddessSayBean bean = (GoddessSayBean) getItem(position);
// final GoddessSayBean bean = (GoddessSayBean) listView.getItemAtPosition(position);
vh.ivTitle.setImageResource(bean.getImageResId());
vh.tvTitle.setText(bean.getTitle());
vh.tvContent.setText(bean.getContent());
vh.tvComment.setText(bean.getComment());
vh.tvZan.setText(bean.getZan());
//就是执行动画过程有问题,点击某一个条目中的展开全文按钮,其它的条目也都会走一下动画展开一下,随后又恢复
vh.ll_expand.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bean.isExpand =!bean.isExpand;//对当前bean对应的值切换
//根据是否展开,重置开始结束值
if(bean.isExpand){
startValue = get3LinesHeight();
endValue = getRealHeight(vh);
}else{
startValue = getRealHeight(vh);
endValue = get3LinesHeight();
}
startAniation(vh,position, startValue, endValue);
}
});
return convertView;
/** 执行动画,
* vh,position当前条目中的
* **/
private void startAniation(final ViewHolder vh, int position,int startValue, int endValue){
ValueAnimator valueAnimator = ValueAnimator.ofInt(startValue,endValue);
final LayoutParams params = (LayoutParams) vh.tv_content.getLayoutParams();
final GoddessSayBean bean = lists.get(position);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator value) {
//动态改变高度
int currentHeight = (Integer) value.getAnimatedValue();
params.height = currentHeight;
vh.tv_content.setLayoutParams(params);
}
});
valueAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator arg0) {
}
@Override
public void onAnimationRepeat(Animator arg0) {
}
@Override
public void onAnimationEnd(Animator arg0) {//结束时切换字和箭头
if(bean.isExpand){
vh.iv_arrow.setBackgroundResource(R.drawable.arrow_up);
vh.tv_expand.setText(mActivity.getResources().getString(R.string.text_recovery));
}else{
vh.tv_expand.setText(mActivity.getResources().getString(R.string.text_expand));
vh.iv_arrow.setBackgroundResource(R.drawable.arrow_down);
}
}
@Override
public void onAnimationCancel(Animator arg0) {
}
});
valueAnimator.setDuration(500);
valueAnimator.start();
}
}
解决办法:
ViewHolder里面存储了与Item布局对应的相关控件了哈~~和传统的ViewHolder模式其实是一样的,所以如果出现复用的问题按照传统方式解决即可。此外该课程中没有涉及到多布局,不过我在github添加了多布局的支持https://github.com/hongyangAndroid/base-adapter-helper ,可以借鉴自行添加。