ListView局部刷新

本文介绍了一个自定义的SocialAdapter,用于实现类似微信朋友圈的功能。当用户对某条动态发表评论后,该适配器能够更新对应的ListView项,包括数据集和视图。通过定位到具体的ViewHolder并重新设置值,实现了高效地刷新界面。

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

最近在做一个类似微信朋友圈的功能,用户可以发布图文动态(以下简称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();
		}
	}

	@Override
	public int getCount() {
		return mDatas.size();
	}

	@Override
	public Object getItem(int position) {
		return mDatas.get(position);
	}

	@Override
	public 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);// 获取item
					if (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");
		......
	}

	@Override
	public 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;
		......
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值