android activity转变view,Listview不消notifydatasetchanged更新数据

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;

}

}

复制代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值