http://blog.csdn.net/jdsjlzx/article/details/45582719
首先,感谢博主“一叶飘舟”分享的上面链接中的这篇文章,是我写这篇博客灵感的所有来源,所以说算是转载的吧,再次谢谢!
正文:
我们都知道ListView在整个Android开发过程中的应用是很广泛的,可谓是举足轻重。随之而来ListView的数据更新也变成为了阻碍很多开发者前进脚步的力量,很多人会说不就是调用Adapter的notifyDataSetChanged()方法进行数据更新就行了吗,对于小应用、数据量不多的应用来说,用这种方法着实方便快捷。但是如果数据量够大,比如一千条、一万条,那么数据更新起来会非常耗时,用户体验会非常不好。
那么,要是能够就单单更新我们指定的item那该多好。这样不就会省时很多,而且这样做对资源的损耗也会降低很多。今天我带来的就是一个listView局部刷新数据的自定义选择列表,先上效果图:
源码下载:http://download.csdn.net/download/mario_0824/8703073
实现步骤:
为了实现对每条Item数据的控制,我们需要新建一个MyListItem类,寄存每条Item的数据内容;
package com.example.databean; public class MyListItem { /* * @parameter data 控制listView显示的内容 * @parameter position 控制listView的position * @parameter chooseType 控制listView的选择状态 选中=1 未选中=-1 * * */ private String data = ""; private int position = 0; private int chooseType = -1; public String getData() { return data; } public void setData(String data) { this.data = data; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public int getChooseType() { return chooseType; } public void setChooseType(int chooseType) { this.chooseType = chooseType; } }
然后,我们需要新建一个MyListItem类型的List用来封装所有Item的数据内容,再者,只需要调用list.set(position,value);方法就能修改指定position的Item的数据,但是,单单改变了List中的数据信息并没有用的,因为这个时候是不会自动更新可视区域的内容的,只有从无到有的绘制过程才会调取其中的数据,那到底怎么才能动态的更新可是区域的数据信息呢,这就涉及到另一个方法了listView.getChildAt(position-first);用来获得需要更新数据的Item的视图布局View,再通过这个布局获取其中的组件修改组件的信息就能够达到动态更新可视化区域的数据了,这一整个过程必须在Handler中实现;我们也可以将listView以参数的形式传入Adapter中,届时我们只需要向外部公开一个updataList()的方法接口就行,其他过程都封装到自定义的Adapter中去实现了;
既然是自定义的listView,那个自定义一个Adapter生成我们需要的Item视图是很有必要的;
package com.example.adapter; import java.util.List; import com.example.databean.MyListItem; import com.example.updatasingelitem.R; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class DataAdapter extends BaseAdapter { private ListView listView; private List<MyListItem> list; private LayoutInflater inflater; private TextView currentTextView; private ImageView currentImageView; public DataAdapter(Context context,ListView listView,List<MyListItem> list) { inflater = LayoutInflater.from(context); this.listView = listView; this.list = list; } /*公开的更新数据方法 * */ public void updataItemData(int position,MyListItem item){ Message message = new Message(); list.set(position,item); message.arg1 = position; handler.sendMessage(message); } @SuppressLint("HandlerLeak") private Handler handler = new Handler(){ public void handleMessage(Message msg) { updataData(msg.arg1); } }; /*实现数据动态更新的方法过程 * */ private void updataData(int position) { if(listView == null){ return; } int first = listView.getFirstVisiblePosition(); View currentView= listView.getChildAt(position-first); currentTextView=(TextView) currentView.findViewById(R.id.item_text); currentTextView.setText(list.get(position).getData()); currentImageView=(ImageView) currentView.findViewById(R.id.item_image); if(list.get(position).getChooseType()==1){ currentImageView.setImageResource(R.drawable.aor); } else{ currentImageView.setImageResource(R.drawable.aos); } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if(convertView==null){ convertView = inflater.inflate(R.layout.layout_item,null); viewHolder = new ViewHolder(); viewHolder.textView = (TextView) convertView.findViewById(R.id.item_text); viewHolder.imageView=(ImageView) convertView.findViewById(R.id.item_image); convertView.setTag(viewHolder); } else{ viewHolder = (ViewHolder) convertView.getTag(); } if(list.get(position).getChooseType()==1){ viewHolder.imageView.setImageResource(R.drawable.aor); } else{ viewHolder.imageView.setImageResource(R.drawable.aos); } viewHolder.textView.setText(list.get(position).getData()); return convertView; } class ViewHolder{ TextView textView; ImageView imageView; } }在main主函数中我们只要调用相应的方法即可:
/* * @description 刷新ListView指定某一条Item的数据 * * */ package com.example.updatasingelitem; import java.util.ArrayList; import java.util.List; import com.example.adapter.DataAdapter; import com.example.databean.MyListItem; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.app.Activity; public class MainActivity extends Activity implements OnItemClickListener{ private ListView listView; private MyListItem listItem; private DataAdapter adapter; private List<MyListItem> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initDatas(); } /*加载所有组件并完成对组件的一些初始化设置操作 * */ private void initViews() { listView=(ListView) findViewById(R.id.MainActivity_ListView); listView.setOnItemClickListener(this); } /*初始化所有所需的数据 * */ private void initDatas() { list = new ArrayList<MyListItem>(); for(int i=0;i<20;i++){ listItem = new MyListItem(); listItem.setPosition(i); listItem.setChooseType(-1); listItem.setData("item"+(i+1)); list.add(listItem); } adapter = new DataAdapter(this,listView,list); listView.setAdapter(adapter); } @Override public void onItemClick(AdapterView<?> parent,View view,int position,long id) { MyListItem item = list.get(position); //改变选择状态 item.setChooseType(list.get(position).getChooseType()*(-1)); //调用已经在Adapter中封装好的给该更新数据的方法 adapter.updataItemData(position,item); } }
布局文件:
activity_main:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ListView android:id="@+id/MainActivity_ListView" android:layout_height="match_parent" android:layout_width="match_parent" android:dividerHeight="5dp" android:divider="@null"/> </LinearLayout>
layout_item:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" android:background="#FFFFFF00"> <View android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp"/> <TextView android:textSize="15sp" android:id="@+id/item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical"/> <View android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp"/> <ImageView android:contentDescription="@string/choose" android:layout_gravity="center_vertical" android:layout_marginRight="10dp" android:id="@+id/item_image" android:layout_height="30dp" android:layout_width="30dp" android:src="@null"/> </LinearLayout>
大家也可以更具需要自行修改,感觉好的话给个好评吧!谢谢!