ListView局部刷新

来源:互联网 发布:ubuntu u盘启动 编辑:程序博客网 时间:2024/06/05 14:42

第一次写博客,请多指教。

最近在做一个类似微信朋友圈的功能,用户可以发布图文动态(以下简称Social),其他用户可以对Social进行点赞或者评论。当用户发布评论成功后要更新这条Social,即要刷新ListView的指定item。实现原理很简单,就是获取到item的ViewHolder,然后重新赋值。

SocialAdapter代码如下:

/** * Social适配器 *  */public class SocialAdapter extends BaseAdapter {private List<Social> mDatas;private LayoutInflater mInflater;private Context mContext;public void setOnSocialItemListener(OnSocialItemListener onSocialItemListener) {this.onSocialItemListener = onSocialItemListener;}public SocialAdapter(Context context, List<Social> socialItems) {this.mDatas = socialItems;this.mContext = context;this.mInflater = LayoutInflater.from(context);}public void setDatas(List<Social> socials) {this.mDatas = socials;}public List<Social> getDatas() {return this.mDatas;}public void addDatas(List<Social> socials) {this.mDatas.addAll(socials);}public void clear() {if (null != mDatas) {mDatas.clear();}}@Overridepublic int getCount() {return mDatas.size();}@Overridepublic Object getItem(int position) {return mDatas.get(position);}@Overridepublic long getItemId(int position) {return position;}/** * 更新单个Item *  * @param listView * @param social */public void update(ListView listView, Social social) {for (int i = 0; i < mDatas.size(); i++) {if (mDatas.get(i).getId() == social.getId()) {int firstVisiblePosition = listView.getFirstVisiblePosition();// 第一个可见Item的位置int lastVisiblePosition = listView.getLastVisiblePosition();// 最后一个可见Item的位置int temp = listView.getHeaderViewsCount();// ListView的HeaderView的数量int index = i + temp;// 根据数据在数据集中的位置求出item在ListView中的位置if (index >= firstVisiblePosition&& index <= lastVisiblePosition) {// 如果item处于可见区域View view = listView.getChildAt(index- firstVisiblePosition);// 获取itemif (view.getTag() instanceof ViewHolder) {ViewHolder holder = (ViewHolder) view.getTag();mDatas.set(i, social);// 更新原始数据集setData(holder, i);// 更新视图,注意这里传的是 i 而不是 index}}}}}private void setData(ViewHolder holder, int position) {L.e("==>  holder setData ");final Social social = mDatas.get(position);holder.txtContent.setText("this is social content");......}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (null == convertView) {holder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_social_b, parent,false);holder.multiImageView = (TextView) convertView.findViewById(R.id.txt_content);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}setData(holder, position);return convertView;}private class ViewHolder {TextView txtContent;......}}


1 0