扫码关注官方订阅号
比如listview的item里面含有姓名、年龄和头像;我想让姓名和年龄实时刷新数据,头像不刷新,怎么用代码实现啊?
ringa_lee
实现的方式参见下面的示例:
public class ParticalRefreshActivity extends ListActivity { String[] contents = new String[]{"aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn","oo","pp","qq","rr","ss","tt","uu","vv","ww","xx","yy","zz"}; ParticalRefreshAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new ParticalRefreshAdapter(this,contents); setListAdapter(mAdapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { mAdapter.refreshFixPosition(position); } class ParticalRefreshAdapter extends BaseAdapter{ public String[] contents; LayoutInflater mInflater; public ParticalRefreshAdapter(Context context,String[] contents){ this.contents = contents; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return contents.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } //局部刷新的代码 public void refreshFixPosition(int position){ //刷新局部的item ViewHolder holder = map.get(position); String text = holder.textView.getText().toString().trim(); holder.textView.setText(text+"-"); //更改数据源,防止滑动时数据错误 contents[position] = text+"-"; } public Map<Integer,ViewHolder> map = new HashMap<>(); @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null) { convertView = mInflater.inflate(R.layout.item_partical_refresh, null); holder = new ViewHolder(); holder.textView = (TextView) convertView.findViewById(R.id.tv_partical_refresh); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(contents[position]); map.put(position, holder); return convertView; } class ViewHolder{ TextView textView; } } }
如果确实如你所说,item数目也没有变化,直接添加监听器,在里面更新就行了啊。
局部更新终究还是要伴随着listview的全局更新的,想想你局部更新,虽然可以内置什么监听器之类的对可视范围内的item进行控件的更新,但当你的item滑动滚出可视范围再滑回来,由于contentView的回收机制,你之前所做的更新将被重置到最初的状态,这时候往往你会考虑要弄一个记录的东西来记录之前修改的item的位置,还有一堆item上的控件的状态,还要对各种状态进行判断,复杂度不见得比全局更新代价小。而全局更新,你只需要根据item的位置修改和adapter绑定的数据集合中对应位置的数据实体,再调nodifyDataSetChanged来更新listview即可,虽然这样是全局更新,但不会引起listview的滚动,用户是感知不到是整体在刷新的。
更改数据源里的年龄姓名,然后notifyDataSetChanged
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
实现的方式参见下面的示例:
如果确实如你所说,item数目也没有变化,直接添加监听器,在里面更新就行了啊。
局部更新终究还是要伴随着listview的全局更新的,想想你局部更新,虽然可以内置什么监听器之类的对可视范围内的item进行控件的更新,但当你的item滑动滚出可视范围再滑回来,由于contentView的回收机制,你之前所做的更新将被重置到最初的状态,这时候往往你会考虑要弄一个记录的东西来记录之前修改的item的位置,还有一堆item上的控件的状态,还要对各种状态进行判断,复杂度不见得比全局更新代价小。而全局更新,你只需要根据item的位置修改和adapter绑定的数据集合中对应位置的数据实体,再调nodifyDataSetChanged来更新listview即可,虽然这样是全局更新,但不会引起listview的滚动,用户是感知不到是整体在刷新的。
更改数据源里的年龄姓名,然后notifyDataSetChanged