自定义listView及其adapter动态刷新

2024-06-18 01:58

本文主要是介绍自定义listView及其adapter动态刷新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址  http://www.cnblogs.com/youjun/archive/2012/03/13/2392718.html


本文主要探讨自定义的adapter及其notifyDataSetChanged()方法的使用(无listView的监听部分):

先上图看下效果:(整个操作过程中,当前Activity未被pause或者stop, 豌豆荚截的图真大....无语)

1,初始化状态,共20个dataItem

2, 15秒后向下滑动,增加了一个text100的item:

3,点击添加后,向下滑动,增加了一个text200的item(每点一次添加按钮就会增加一个text200的item):

4,点击删除按钮,上下滑动(每点一次,listView中的item就减少一个):

 

代码部分未贴完整,有简要注释,未考虑优化

adapter.xml:

复制代码
<ListView
android:id="@+id/listview1"
android:layout_width
="fill_parent"
android:layout_height
="0dp"
android:layout_weight
="1"
android:cacheColorHint
="#00000000" />

<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"保证了Android平台在布局时会先计算其他元素(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:

复制代码
<TextView
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 listView;

private List<HashMap<String, String>> data;

private ListViewAdapter adapter;

@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();刷新无效
break;
}
}
};

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>> data;
private int resource;
private LayoutInflater inflater;

private HashMap<String, String> itemData;

public ListViewAdapter(Context context,
List<HashMap<String, String>> data, int resource) {
// super(context, data, resource, from, to);
this.data = data;
this.resource = resource;
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return data.size();
}

@Override
public Object getItem(int position) {
return null;
}

@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 convertView;
}
}

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");

break;
case R.id.button_delete:
Log.i(Constant.TAG, "DELETE");
data.remove(1);
break;
}
adapter.notifyDataSetChanged();// adapter更改后刷新view
}
}

}
复制代码

这篇关于自定义listView及其adapter动态刷新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070989

相关文章

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

vue子路由回退后刷新页面方式

最近碰到一个小问题,页面中含有 <transition name="router-slid" mode="out-in"><router-view></router-view></transition> 作为子页面加载显示的地方。但是一般正常子路由通过 this.$router.go(-1) 返回到上一层原先的页面中。通过路由历史返回方式原本父页面想更新数据在created 跟mounted

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

QT 中ListView和ListWidget有什么区别

ListView和ListWidget在Qt框架中都是用于显示列表数据的控件,但它们在使用方法和特性上存在一些明显的差异。以下是关于它们用法不一样的地方的详细分析: 数据管理方式: ListView:使用QAbstractItemModel数据模型来管理和显示列表数据。QAbstractItemModel是一个抽象类,允许开发者自定义数据模型以适应特定的数据结构和需求。这使得ListView在处

添加自定义的CALayer

iOS开发UI篇—CAlayer(创建图层) 一、添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控制器view的layer上)  1 // 2 // YYViewController.m 3 // 01-创建一个简单的图层 4 // 5 //

android自定义View的和FramgentActivity的一个小坑

对于自定义View //加载样式TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView, defStyleAttr, 0);setTitle(typedArray.getString(R.styleable.TitleBarView_main_title));//不能写成

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 `SOAPHEADERS` 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类,该子类将继承不特定于方法的标头信息 — 包含在 <request> 或 <response> 元素中的标头信