需求以点赞为例子只刷新点赞的数量并将点赞的哪一个设置为黑色,因为直接用adapter的notifyDataSetChanged 会全部刷新
需要浪费时间 而且图片重新加载会导致闪烁,造成不好的用户体验感
核心代码
public void updateItem(ListView listView, BBS bbs) {
if (listView != null) {
int start = listView.getFirstVisiblePosition();
for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)
if (bbs.getId() == ((BBS) listView.getItemAtPosition(i)).getId()) {
View view = listView.getChildAt(i - start);
//getView(i, view, listView);
//想办法拿到holdler 我这边是框架直接拿到holder
ViewHolder viewHolder = ViewHolder.getViewHolder(view);
//点赞数 想办法拿到holder的点赞数的组件 我这里也是因为框架所以这样
TextView textLikeNum = viewHolder.getTextView(R.id.text_like_num);
//点赞的图的 想办法拿到holder的点赞的图组件 我这里也是因为框架所以这样
ImageView imgLike = viewHolder.getImageView(R.id.img_like);
if (bbs.getPraised() == 1) {//服务器返回如果某个字段为1 就是自己已经点赞 设置背景和颜色
Log.i("执行了", "getPraised: ");
imgLike.setImageResource(R.mipmap.ic_like_select);
textLikeNum.setTextColor(context.getResources().getColor(R.color.color_232427));
textLikeNum.setText(bbs.getPraisedCount()+"");
} else if (bbs.getPraised() == 0) {
Log.i("执行了", "getPraised: ");
imgLike.setImageResource(R.mipmap.ic_like_normal);
textLikeNum.setTextColor(context.getResources().getColor(R.color.color_e1e8eb));
textLikeNum.setText(bbs.getPraisedCount()+"");
}
// getView(i, view, listView); //直接执行
break;
}
}
}
调用代码
请求完网络 从事件总线框架拿到新的praise和bbs
BBS bbs = (BBS) event.getBbs();
Praise praise = event.getPraise();
int i = bbsAdapter.data.indexOf(bbs);
BBS mybbs = (BBS) bbsAdapter.data.get(i);
//重新设置点赞
mybbs.setPraised(praise.getPraised());
mybbs.setPraisedCount(praise.getAmount());
bbsAdapter.updateItem(listBbs,bbs);