第一次写博客,请多指教。
最近在做一个类似微信朋友圈的功能,用户可以发布图文动态(以下简称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;
......
}
}