Android——Listview不消notifydatasetchanged更新数据的方式

一、介绍

常州网站开发培训先来介绍一下listview更新数据的几种方式,当前我晓得的方式好似下几种:

1. 每次更新数据时都挪用listview.setadapter();

2. 每次更新数据时都挪用adapter.notifydatasetchanged();

3. 在自定义的adapter里增加更新函数update;

这里,我们将会一个一个来介绍

1. 每次更新数据时都挪用listview.setadapter();

这个方式是服从非常低的,因为它无论你其它的数据需不需求刷新,它都邑将全部的数据刷新一遍,也即是说将全部listview刷新一遍,估计会一点Android的人都不会用这种方式,但我们照旧将其列出来,可以与其它方式举行对比。

1.1 先上截图:

点击更新后:

1.2 activity_main.xml文件

复制代码

android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.listviewupdate.MainActivity"
tools:ignore="MergeRootFrame" xmlns:android="http://schemas.android.com/apk/res/android">
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="企业培训更新"/>
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content">

复制代码

1.3 item.xml文件:

复制代码

android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

复制代码

1.4 MainActivity.java文件:

复制代码

package com.example.listviewupdate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.os.Build;
public class MainActivity extends Activity {
private ListView listview;
private List>list = new ArrayList>();
private MyAdapter adapter;
private Button btn;
Mapmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
//初始化数据
for (int i = 0; i < 8; i++) {
map = new HashMap();
map.put("Id", "100"+i);
map.put("Name","Name_"+i);
list.add(map);
}
adapter = new MyAdapter(this, list);
listview.setAdapter(adapter);
btn = (Button) findViewById(R.id.btn);

//好比说,要更新listview里第三行的Name,但常州软件技术培训底下的做法是从新加载了一下adapter

//也即是说它刷新了全部listview,无论其余的数据需不需求更新;

btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
map = list.get(2);
map.put("Name", "更新的名字");
//这里MyAdapter的第一个参数不消this缘故是因为这里是一个匿名里面类,
//this指向的是onClick里
adapter = new MyAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
}
});
}
//自定义adapter
public class MyAdapter extends BaseAdapter{
List>list;
LayoutInflater inflater;
public MyAdapter(Context context,List>list){
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder;
if(convertView==null){
convertView = inflater.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
viewHolder.tv2 =(TextView) convertView.findViewById(R.id.tv2);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv1.setText(list.get(position).get("Id").toString());
viewHolder.tv2.setText(list.get(position).get("Name").toString());
return convertView;
}
}
//辅助类
class ViewHolder{
TextView tv1;
TextView tv2;
}
}

复制代码

2. 每次更新数据时都挪用adapter.notifydatasetchanged();

如果适配器的内容转变,notifyDataSetChanged方式将会通过一个外部方式强迫挪用getView来刷新每个Item的内容。(这句话是网上看到的,说的也不是太清楚,看了一下notifydatasetchanged()源码也不是很清楚。),这个方式在数据量对照少,刷新频率对照慢的环境下照旧不错的。

结构甚么的都和上头同样,这里就只发MainActivity.java里面的内容。

复制代码

btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
map = list.get(2);
map.put("Name", "更新常州平台运营的名字");
//只用这里转变了
adapter.notifyDataSetChanged();
}
});
}

复制代码

3. 在自定义的adapter里增加更新函数update;

这种方式会更新你指定处所指定位置的数据,好比说Listview的第三个item项的第二个TextView,辣么它就只更新这里,其余的不会更新(通过网上材料和个人清晰)。layout结构都是同样的,这里要紧是自定义adapter里的转变。

复制代码

btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
map = list.get(2);
map.put("Name", "更新的名字");
//只有这里转变
adapter.update(2, listview);
}
});

复制代码

复制代码

public class MyAdapter extends BaseAdapter{
List>list;
LayoutInflater inflater;
public MyAdapter(Context context,List>list){
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void update(int index,ListView listview){
//得到常州微信公众平台第一个可见item项的位置
int visiblePosition = listview.getFirstVisiblePosition();
//得到指定位置的视图,对listview的缓存机制不清楚的可以去打听下
View view = listview.getChildAt(index - visiblePosition);
ViewHolder holder = (ViewHolder) view.getTag();
holder.tv2 = (TextView) view.findViewById(R.id.tv2);
setData(holder,index);
}
private void setData(ViewHolder holder,int index){
Mapmap = list.get(index);
holder.tv2.setText(map.get("Name").toString());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder;
if(convertView==null){
convertView = inflater.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
viewHolder.tv2 =(TextView) convertView.findViewById(R.id.tv2);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv1.setText(list.get(position).get("Id").toString());
viewHolder.tv2.setText(list.get(position).get("Name").toString());
return convertView;
}
}

复制代码

只有这两个处所转变了一下。