listview和adapter的setadapter是使用线程吗

一个令人无比蛋疼的线程里更新ListView的问题
[问题点数:100分,结帖人treachery]
一个令人无比蛋疼的线程里更新ListView的问题
[问题点数:100分,结帖人treachery]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年2月 移动平台大版内专家分月排行榜第二2012年1月 移动平台大版内专家分月排行榜第二2011年5月 移动平台大版内专家分月排行榜第二2011年4月 移动平台大版内专家分月排行榜第二2009年1月 移动平台大版内专家分月排行榜第二
2011年12月 移动平台大版内专家分月排行榜第三2011年11月 移动平台大版内专家分月排行榜第三2011年9月 移动平台大版内专家分月排行榜第三2011年8月 移动平台大版内专家分月排行榜第三2010年3月 移动平台大版内专家分月排行榜第三2010年2月 移动平台大版内专家分月排行榜第三2009年4月 移动平台大版内专家分月排行榜第三2009年3月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|没有更多推荐了,
不良信息举报
举报内容:
setAdapter和requestAsyncTask组合使用揭秘
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!关于listView setAdapter方法,无语纠结中,真心求助。。
[问题点数:100分,结帖人ivangao1983]
关于listView setAdapter方法,无语纠结中,真心求助。。
[问题点数:100分,结帖人ivangao1983]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年6月 移动平台大版内专家分月排行榜第二
2011年6月 移动平台大版内专家分月排行榜第二
2011年6月 移动平台大版内专家分月排行榜第二
2011年6月 移动平台大版内专家分月排行榜第二
2011年6月 移动平台大版内专家分月排行榜第二
匿名用户不能发表回复!|小试牛刀---自定义listView及其adapter动态刷新
本文主要探讨自定义的adapter及其notifyDataSetChanged()方法的使用(无listView的监听部分):
先上图看下效果:(整个操作过程中,当前Activity未被pause或者stop, 豌豆荚截的图真大....无语)
&1,初始化状态,共20个dataItem
2, 15秒后向下滑动,增加了一个text100的item:
3,点击添加后,向下滑动,增加了一个text200的item(每点一次添加按钮就会增加一个text200的item):
4,点击删除按钮,上下滑动(每点一次,listView中的item就减少一个):
代码部分未贴完整,有简要注释,未考虑优化
adapter.xml:
&&&&&&& android:id=&@+id/listview1&
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&0dp&
&&&&&&& android:layout_weight=&1&
&&&&&&& android:cacheColorHint=&#& /&
&&& &LinearLayout
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:orientation=&horizontal&
&&&&&&& &Button
&&&&&&&&&&& android:id=&@+id/button_add&
&&&&&&&&&&& android:layout_width=&0dp&
&&&&&&&&&&& android:layout_height=&wrap_content&
&&&&&&&&&&& android:layout_weight=&1&
&&&&&&&&&&& android:text=&添加& &
&&&&&&& &/Button&
&&&&&&& &Button
&&&&&&&&&&& android:id=&@+id/button_delete&
&&&&&&&&&&& android:layout_width=&0dp&
&&&&&&&&&&& android:layout_height=&wrap_content&
&&&&&&&&&&& android:layout_weight=&1&
&&&&&&&&&&& android:text=&删除& &
&&&&&&& &/Button&
&&& &/LinearLayout&
&ListView/&标签中属性android:layout_height=&0dp&和android:layout_weight=&1&保证了平台在布局时会先计算其他元素(linearLayout)的宽高,再计算当前listView的宽高等属性,因android:layout_weight=&XXX&默认值为0, 1的优先级要比0低(如果整个xml是RelativeLayout布局,就easy了,有直接的属性可以设置)
两个&Button/&标签中的属性android:layout_weight=&1&和android:layout_width=&0dp&,使得他们的父元素在布局时,为他们平均分配空间,如果在其中一个&Button/&设置了间隔,如android:layout_marginLeft = &xxxdp&,那么父元素会先减去此间隔xxxdp,剩下空间依旧平均分配给两个button按钮
adapter_item.xml:
&&&&&&& android:id=&@+id/textview1&
&&&&&&& android:layout_width=&wrap_content&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:textColor=&#FF0000&
&&&&&&& android:textSize=&25dp& /&
&&& &Button
&&&&&&& android:id=&@+id/button1&
&&&&&&& android:layout_width=&wrap_content&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:layout_marginLeft=&150dp&
&&&&&&& android:focusable=&false& /&
Activity类AdapterActivity:
public class AdapterActivity extends Activity {
&&& private ListView listV
&&& private List&HashMap&String, String&&
&&& private ListViewA
&&& @Override
&&& protected void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.adapter);
&&&&&&& listView = (ListView) findViewById(R.id.listview1);
&&&&&&& Button addButton = (Button) findViewById(R.id.button_add);
&&&&&&& Button deleteButton = (Button) findViewById(R.id.button_delete);
&&&&&&& ButtonListener listener = new ButtonListener();
&&&&&&& addButton.setOnClickListener(listener);
&&&&&&& deleteButton.setOnClickListener(listener);
&&&&&&& this.initListView();
&&&&&&& Timer timer = new Timer();
&&&&&&& timer.schedule(new TimerTask() {// 15秒后向data集合中增加一条数据
&&&&&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&&&&&& public void run() {
&&&&&&&&&&&&&&&&&&&&&&& HashMap&String, String& map = new HashMap&String, String&();
&&&&&&&&&&&&&&&&&&&&&&& map.put(&text&, &text100&);
&&&&&&&&&&&&&&&&&&&&&&& map.put(&buttonText&, &buttonText100&);
&&&&&&&&&&&&&&&&&&&&&&& data.add(map);
&&&&&&&&&&&&&&&&&&&&&&& Log.i(Constant.TAG, &添加数据成功&);
&&&&&&&&&&&&&&&&&&&&&&& // adapter.notifyDataSetChanged(); 非UI线程报错
&&&&&&&&&&&&&&&&&&&&&&& Message msg = new Message();
&&&&&&&&&&&&&&&&&&&&&&& msg.what = 1;
&&&&&&&&&&&&&&&&&&&&&&& handler.sendMessage(msg);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }, 15000);
&&& private Handler handler = new Handler() {
&&&&&&& @Override
&&&&&&& public void handleMessage(Message msg) {
&&&&&&&&&&& // super.handleMessage(msg);
&&&&&&&&&&& switch (msg.what) {
&&&&&&&&&&& case 1:
&&&&&&&&&&&&&&& // UI线程中调用此方法通知观察者(中关于adapter存在一个observer,未深究!)adapter数据已改变,刷新view
&&&&&&&&&&&&&&& adapter.notifyDataSetChanged();
&&&&&&&&&&&&&&& // adapter.notifyDataSetInvalidated();// 与上面
&&&&&&&&&&&&&&& // 效果相同,源码中除了注释不同,执行的代码一样,同样未深究
&&&&&&&&&&&&&&& // listView.postInvalidate();刷新无效
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&& private void initListView() {
&&&&&&& data = ViewApp.getData();// ViewApp是一个全局的类,程序运行时data数据即加载完毕,这是只是赋值到data成员变量中
&&&&&&& adapter = new ListViewAdapter(this, data, R.layout.adapter_item);
&&&&&&& SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
&&&&&&&&&&&&&&& R.layout.adapter_item, new String[] { &text&, &buttonText& },
&&&&&&&&&&&&&&& new int[] { R.id.textview1, R.id.button1 });
&&&&&&& listView.setAdapter(adapter);
&&& class ListViewAdapter extends BaseAdapter {
&&&&&&& private List&HashMap&String, String&&
&&&&&&& private LayoutI
&&&&&&& private HashMap&String, String& itemD
&&&&&&& public ListViewAdapter(Context context,
&&&&&&&&&&&&&&& List&HashMap&String, String&& data, int resource) {
&&&&&&&&&&& // super(context, data, resource, from, to);
&&&&&&&&&&& this.data =
&&&&&&&&&&& this.resource =
&&&&&&&&&&& inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
&&&&&&& @Override
&&&&&&& public int getCount() {
&&&&&&&&&&& return data.size();
&&&&&&& @Override
&&&&&&& public Object getItem(int position) {
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public long getItemId(int position) {
&&&&&&&&&&& return 0;
&&&&&&& // 渲染每一个item的数据,每次上下滑动显示数据时都会调用此方法
&&&&&&& @Override
&&&&&&& public View getView(int position, View convertView, ViewGroup parent) {
&&&&&&&&&&& if (null == convertView) {
&&&&&&&&&&&&&&& convertView = inflater.inflate(resource, null);
&&&&&&&&&&& }
&&&&&&&&&&& // convertView.setTag(&abc&);
&&&&&&&&&&& itemData = data.get(position);
&&&&&&&&&&& TextView textView = (TextView) convertView
&&&&&&&&&&&&&&&&&&& .findViewById(R.id.textview1);
&&&&&&&&&&& textView.setText(itemData.get(&text&));
&&&&&&&&&&& final Button button = (Button) convertView
&&&&&&&&&&&&&&&&&&& .findViewById(R.id.button1);
&&&&&&&&&&& button.setText(itemData.get(&buttonText&));
&&&&&&&&&&& button.setOnClickListener(new View.OnClickListener() {
&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&& public void onClick(View v) {
&&&&&&&&&&&&&&&&&&& Toast.makeText(AdapterActivity.this, button.getText(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& Toast.LENGTH_SHORT).show();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& });
&&&&&&&&&&& return convertV
&&& class ButtonListener implements View.OnClickListener {
&&&&&&& @Override
&&&&&&& public void onClick(View v) {
&&&&&&&&&&& switch (v.getId()) {
&&&&&&&&&&& case R.id.button_add:
&&&&&&&&&&&&&&& HashMap&String, String& map = new HashMap&String, String&();
&&&&&&&&&&&&&&& map.put(&text&, &text200&);
&&&&&&&&&&&&&&& map.put(&buttonText&, &buttonText200&);
&&&&&&&&&&&&&&& data.add(map);
&&&&&&&&&&&&&&& Log.i(Constant.TAG, &ADD&);
&&&&&&&&&&&&&&&
&&&&&&&&&&& case R.id.button_delete:
&&&&&&&&&&&&&&& Log.i(Constant.TAG, &DELETE&);
&&&&&&&&&&&&&&& data.remove(1);
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&& adapter.notifyDataSetChanged();// adapter更改后刷新view
摘自& 我说_小莫&&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
android 中listview之BaseAdapter的使用
摘要:Listview控件不像其他安卓控件那种直接拖拽到界面上就能用,而是采用类似J2EE中的MVC模型的方式使用,需要通过适配器将某种样式的数据或控件添加到其上而使用.MVC模型实现原理是数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。利用BaseAdapter实现一个ListView的步骤一般如下:1首先准备好需要显示在LiseView中的数据——List2然后编写2个XML文件第一个文件是ListView控件所在的布局文
Listview控件不像其他安卓控件那种直接拖拽到界面上就能用,而是采用类似J2EE中的MVC模型的方式使用,需要通过适配器将某种样式的数据或控件添加到其上而使用.
MVC模型实现原理是 数据模型M(Model) 存放数据,利用控制器C (Controller)将数据显示在视图V (View)上。
利用BaseAdapter实现一个ListView的步骤一般如下:1 首先准备好需要显示在LiseView中的数据 ——List2 然后编写2 个XML 文件 第一个文件是ListView控件所在的布局文件 第二个文件是ListVIew中每一个item的布局文件3 创建一个继承自BaseAdapter的类4 为ListView绑定适配器 setAdapter(继承BaseAdapter 类的实例)5 用传统方式来覆写适配器的getView函数和getCount 函数(从参数convertView里映射布局文件,find各个控件填充数据)6 加入ViewHolder类(定义n个控件的声明)用convertView.setTag(viewHolder)在View和Object之间关联,此目的是节省find多次的时间。
步骤一 List的使用
数据源可以有多种形式,比如是一个数组,或者是一个list 其作用是使lisview中每一行显示出数据源的每一个元素的值。比如ListView中每一个item只有一个控件 TextView 则list可以定义成一个字符串数组,或者一个ArrayList
如果ListView中每一个item有很多个控件,则可以把多个控件的值类型定义成一个类如Item类 格式如下
public class Item{
int imageId;
//省略setter和getter方法}
则此时List定义成List
并且初始化为
List&Item& listItems = new ArrayList&&();
并赋予值如下
for(int i = 0 ; i & 10 ; i ++){
Item item = new Item();
item.setName(&sqf&);
item.setText(&Hello World&);
item.setNumber(i);
item.setImageId( R.drawable.ic_launcher);
listItems.add(item);}
或者将多个控件的值的类型包装成Map ,改成如下格式:
List&Map&String , Object&& listItems = new ArrayList&Map&String , Object&&();Map&String, Object&
for(int i=0;i&10;i++)
map = new HashMap&String, Object&();
map.put(&imageId&, R.drawable.ic_launcher);
map.put(&text&, &hello World&);
map.put(&name& , &sqf&);
map.put(&number&, i);
listItems.add(map);
此时list已经构建完毕,已经得到了需要加入ListView中的值了。
步骤二 编写需要ListView布局文件以及ListView中item的布局文件
ListView布局文件的例子如下:activity所在的布局XML中只需要含有listview的控件,listview中每一行的item的具体布局则在另一个xml文件中
&?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=&match_parent&
android:orientation=&vertical&&
&ListView android:id=&@+id/list_view&
android:layout_height=&match_parent&
android:layout_width=&match_parent&&
&/ListView&&/LinearLayout&
ListView的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=&match_parent&
android:orientation=&vertical&&
android:id=&@+id/text&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:padding=&20dp&
android:gravity=&center_horizontal&
android:textSize=&20dp&/&&/LinearLayout&
步骤三 创建一个继承自BaseAdapter的类
例子如下所示:
private class ExampleAdapter extends BaseAdapter{
private LayoutInflater mInflater =
private ExampleAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
public int getCount() {
return listItems.size();
public Object getItem(int position) {
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
这里主要需要重写的方法有getcount 和getView 因为在绘制listview的时候需要多次调用getcount方法和getView方法。这里getCount的返回值就是第一步里面定义的listItems大小。同时在这个类里定一个成员变量mInflater和一个构造方法。
layoutInflater的作用
LayoutInflater的作用类似于findviewById() .不同在于LayoutInflater是用来找res/layout下的xml布局文件,并且实例化。具体作用如下:1 对于一个没有载入或者想要动态载入的界面,都需要使用Layoutinflater.inflater() 来载入。 2 对于已经载入的界面,就可以使用Activity.findViewById()方法来获取其中的界面元素。
获得layoutInflater实例的三种方式
1 layoutinflater inflater = getLayoutInflater();2 LayoutInflater localinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)3 LayoutInflater inflater = LayoutInflater.from(context)
这三种的本质都是调用context.getSystemService()
获得实例之后可以通过实例调用该类的方法inflate 这个方法有一下几种的过载形式,返回值均为View对象.
public View inflate (int resource, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
示例代码如下:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
//下面第二个参数可以为Null
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));
//EditText editText = (EditText)findViewById(R.id.content);// error
EditText editText = (EditText)view.findViewById(R.id.content);
步骤四 为ListView 绑定适配器
首先实例化自定义的Adapter,然后找到listview视图的对象,用setAdapter方法为ListVIew绑定适配器。例子如下:
private ListV private ExampleAdapter adapter = new ExampleAdapter(); listview.setAdapter(adapter);
步骤五 六 覆盖getView方法
View getView():返回列表项对应的视图,方法体中
1 ◆实例化视图填充器
2 ◆用视图填充器,根据Xml文件,实例化视图
3 ◆根据布局找到控件,并设置属性
4 ◆返回View视图实例如下:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
if(convertView == null){
convertView = mInflater.inflate(R.layout.item_list_view,null);
viewHolder.textView = (TextView)convertView.findViewById(R.id.list_view_text);
convertView.setTag(viewHolder);
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.textView.setText(listItems.get(position));
return convertV
private class ViewHolder{
TextView textV
这里调用自带的convertview ,如果缓存为空 将LayoutInflater的实例赋给convertview,convertview用来存储加载布局(listview的item 的layout)的layout.xml,同时在讲加载布局内的findViewById的值放到viewHoler中。如果convertview不为空,则将findviewById的值取出来。这里就完成了实例化视图以及根据布局查找控件。接下里将存储数据的listItems来给view中的控件设置属性。最后返回view视图。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
android 中listview之BaseAdapter的使用相关信息,包括
的信息,所有android 中listview之BaseAdapter的使用相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International}

我要回帖

更多关于 listview baseadapter 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信