- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android仿QQ好友列表分组实现增删改及持久化由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
android自带的控件expandablelistview实现了分组列表功能,本案例在此基础上进行优化,为此控件添加增删改分组及子项的功能,以及列表数据的持久化.
demo实现效果:
。
grouplistdemo具体实现:
①demo中将列表页面设计为fragment页面,方便后期调用;在主界面mainactivity中动态添加grouplistfragment页面; 。
mainactivity.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
com.eric.grouplistdemo;
import
android.app.activity;
import
android.app.fragment;
import
android.app.fragmentmanager;
import
android.os.bundle;
import
android.widget.relativelayout;
public
class
mainactivity
extends
activity {
public
static
grouplistfragment fragment;
@override
protected
void
oncreate(bundle savedinstancestate) {
super
.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
fragment =
new
grouplistfragment();
getfragmentmanager().begintransaction()
.replace(r.id.fragcontainer, fragment).commit();
}
}
|
动态添加grouplistfragment实例到界面的fragcontainer布局中;将fragment声明为static用于在adapter中组添加子项时进行调用.
activity_main.xml 。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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"
>
<relativelayout
android:id=
"@+id/fragcontainer"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
</relativelayout>
</linearlayout>
|
②实现自定义适配器类myadapter,继承自baseexpandablelistadapter;组项布局及子项布局; 。
list_item_parent.xml组项布局文件,展开图标及名称,增删图标; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<relativelayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"50dp"
android:background=
"#0099ff"
android:orientation=
"horizontal"
>
<imageview
android:id=
"@+id/image_parent"
android:layout_width=
"50dp"
android:layout_height=
"50dp"
android:src=
"@drawable/image_parent1"
/>
<textview
android:id=
"@+id/text_parent"
android:layout_width=
"wrap_content"
android:layout_height=
"50dp"
android:textcolor=
"#fff"
android:textsize=
"20sp"
android:text=
"parent1"
android:layout_torightof=
"@id/image_parent"
android:gravity=
"center"
/>
<imageview
android:id=
"@+id/image_delete"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
android:layout_centervertical=
"true"
android:layout_alignparentright=
"true"
android:src=
"@drawable/delete"
/>
<imageview
android:id=
"@+id/image_add"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
android:layout_centervertical=
"true"
android:layout_toleftof=
"@id/image_delete"
android:src=
"@drawable/add"
/>
</relativelayout>
|
list_item_child.xml子项布局文件,名称及删除图标; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<relativelayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
>
<textview
android:id=
"@+id/text_child"
android:layout_width=
"wrap_content"
android:layout_height=
"40dp"
android:layout_margin=
"5dp"
android:textcolor=
"#0099ff"
android:text=
"child"
android:layout_centerinparent=
"true"
android:gravity=
"center"
/>
<imageview
android:id=
"@+id/image_delete"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
android:layout_alignparentright=
"true"
android:layout_centervertical=
"true"
android:src=
"@drawable/delete"
/>
</relativelayout>
|
myadapter.java自定义适配器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
package
com.eric.grouplistdemo;
import
java.util.list;
import
java.util.map;
import
android.content.context;
import
android.util.log;
import
android.view.layoutinflater;
import
android.view.view;
import
android.view.view.onclicklistener;
import
android.view.viewgroup;
import
android.widget.baseexpandablelistadapter;
import
android.widget.edittext;
import
android.widget.imageview;
import
android.widget.textview;
public
class
myadapter
extends
baseexpandablelistadapter{
private
list<string> parentlist;
private
map<string,list<string>> map;
private
context context;
private
edittext edit_modify;
private
modifydialog dialog;
//构造函数
public
myadapter(context context, list<string> parentlist, map<string,list<string>> map) {
this
.context = context;
this
.parentlist = parentlist;
this
.map = map;
}
//获取分组数
@override
public
int
getgroupcount() {
return
parentlist.size();
}
//获取当前组的子项数
@override
public
int
getchildrencount(
int
groupposition) {
string groupname = parentlist.get(groupposition);
int
childcount = map.get(groupname).size();
return
childcount;
}
//获取当前组对象
@override
public
object getgroup(
int
groupposition) {
string groupname = parentlist.get(groupposition);
return
groupname;
}
//获取当前子项对象
@override
public
object getchild(
int
groupposition,
int
childposition) {
string groupname = parentlist.get(groupposition);
string chidlname = map.get(groupname).get(childposition);
return
chidlname;
}
//获取组id
@override
public
long
getgroupid(
int
groupposition) {
return
groupposition;
}
//获取子项id
@override
public
long
getchildid(
int
groupposition,
int
childposition) {
return
childposition;
}
@override
public
boolean
hasstableids() {
return
true
;
}
//组视图初始化
@override
public
view getgroupview(
int
groupposition,
boolean
isexpanded,
view convertview, viewgroup parent) {
final
int
grouppos = groupposition;
if
(convertview ==
null
){
convertview = layoutinflater.from(context).inflate(r.layout.list_item_parent,
null
);
}
imageview image = (imageview) convertview.findviewbyid(r.id.image_parent);
imageview image_add = (imageview) convertview.findviewbyid(r.id.image_add);
imageview image_delete = (imageview) convertview.findviewbyid(r.id.image_delete);
if
(isexpanded){
image.setimageresource(r.drawable.image_parent2);
}
else
{
image.setimageresource(r.drawable.image_parent1);
}
image_add.setonclicklistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
alertadddialog(mainactivity.fragment.getactivity(),
"新增子项"
, grouppos);
}
});
image_delete.setonclicklistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
grouplistfragment.deletegroup(grouppos);
}
});
textview parenttext = (textview) convertview.findviewbyid(r.id.text_parent);
parenttext.settext(parentlist.get(groupposition));
return
convertview;
}
//子项视图初始化
@override
public
view getchildview(
int
groupposition,
int
childposition,
boolean
islastchild, view convertview, viewgroup parent) {
final
int
grouppos = groupposition;
final
int
childpos = childposition;
if
(convertview ==
null
){
convertview = layoutinflater.from(context).inflate(r.layout.list_item_child,
null
);
}
textview childtext = (textview) convertview.findviewbyid(r.id.text_child);
imageview image_delete = (imageview) convertview.findviewbyid(r.id.image_delete);
string parentname = parentlist.get(groupposition);
string childname = map.get(parentname).get(childposition);
childtext.settext(childname);
image_delete.setonclicklistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
grouplistfragment.deletechild(grouppos, childpos);
}
});
return
convertview;
}
@override
public
boolean
ischildselectable(
int
groupposition,
int
childposition) {
return
true
;
}
//弹新增子项对话框
public
void
alertadddialog(context context, string title,
int
currentgroup){
final
int
group = currentgroup;
dialog =
new
modifydialog(context, title,
null
);
edit_modify = dialog.getedittext();
dialog.setonclickcommitlistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
grouplistfragment.addchild(group, edit_modify.gettext().tostring());
dialog.dismiss();
}
});
dialog.show();
}
}
|
构造函数:将传入的parentlist和map进行数据同步,parentlist保存组数据,map保存对应组及其子项list数据; 获取分组数及子项数等很简单,就不介绍了,主要讲述一下,组视图初始化和子项视图初始化这两个函数; 。
组视图初始化getgroupview():尽量复用convertview防止内存泄露,首先是进行判断,若convertview为空,则进行组视图初始化,加载list_item_parent子项布局;获取到相应的组布局控件:展开图标image、添加图标image_add、删除图标image_delete;通过传递过来的布尔类型参数isexpanded,进行判断给image赋值展开图标或合并图标;分别给添加图标和删除图标添加点击事件,分别调用grouplistfragment中的弹出添加窗口函数alertadddialog()和删除组函数deletegroup(); 。
子项视图初始化getchildview():同样尽量复用convertview防止内存泄露,首先是进行判断,若convertview为空,则进行子项视图初始化,加载list_item_child子项布局;获取到相应的子布局控件:内容文本childtext和删除图标image_delete;从parentlist和map中分别获取到,当前子项的组名parentname和子项名childname,赋值childtext,删除图标添加点击事件,调用删除子项函数deletechild(); 。
③实现自定义对话框类modifydialog,继承自dialog类,对输入修改内容,或新增项内容进行过渡; 。
no_title_dialog.xml,在values目录下自定义dialog的style类型xml,除去dialog的标题栏; 。
1
2
3
4
5
6
7
8
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<resources xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<style name=
"notitledialog"
parent=
"android:style/theme.dialog"
>
<item name=
"android:width"
>300dp</item>
<item name=
"android:height"
>40dp</item>
<item name=
"android:windownotitle"
>
true
</item>
</style>
</resources>
|
dialog_modify.xml 自定义对话框的布局文件,标题文本,输入框,确定按钮; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?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"
>
<textview
android:id=
"@+id/text_title"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:gravity=
"center"
android:background=
"#0099ff"
android:text=
"修改名称"
android:textcolor=
"#fff"
android:textsize=
"20sp"
/>
<edittext
android:id=
"@+id/edit_modify"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"组名称"
/>
<button
android:id=
"@+id/btn_commit"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"确定"
android:textcolor=
"#fff"
android:background=
"#0099ff"
/>
</linearlayout>
|
modifydialog.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package
com.eric.grouplistdemo;
import
android.app.dialog;
import
android.content.context;
import
android.view.layoutinflater;
import
android.view.view;
import
android.widget.button;
import
android.widget.edittext;
import
android.widget.textview;
public
class
modifydialog
extends
dialog{
private
textview text_title;
private
edittext edit_modify;
private
button btn_commit;
public
modifydialog(context context, string title, string name) {
super
(context, r.style.notitledialog);
view view = layoutinflater.from(getcontext())
.inflate(r.layout.dialog_modify,
null
);
text_title = (textview) view.findviewbyid(r.id.text_title);
edit_modify = (edittext)view.findviewbyid(r.id.edit_modify);
btn_commit = (button) view.findviewbyid(r.id.btn_commit);
text_title.settext(title);
edit_modify.settext(name);
super
.setcontentview(view);
}
public
edittext getedittext(){
return
edit_modify;
}
public
void
setonclickcommitlistener(view.onclicklistener listener){
btn_commit.setonclicklistener(listener);
}
}
|
modifydialog自定义构造函数中,通过super()加载刚刚自定义的no_title_dialog.xml,声明view加载layout布局dialog_modify.xml;并且获取布局中的相应控件,将构造函数中传来的字符串title和name,分别赋值到标题文本和输入框控件中;最后调用setcontentview()初始化对话框视图; 添加一个返回输入框控件的函数getedittext(),用于获取输入框输入的内容; 。
还需要一个自定义的点击事件监听器,绑定在确定按钮上; 。
④准备工作都完成了,下面就实现grouplistfragment,包括数据的初始化及持久化保存,组项和子项的增删改操作,列表子项点击事件,列表组项和子项的长按事件; 。
fragment_group_list.xml 页面的布局文件expandablelistview列表以及一个添加组图标; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<relativelayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<expandablelistview
android:id=
"@+id/expandablelistview"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:groupindicator=
"@null"
>
</expandablelistview>
<imageview
android:id=
"@+id/image_add"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
android:layout_centerhorizontal=
"true"
android:layout_alignparentbottom=
"true"
android:src=
"@drawable/add"
/>
</relativelayout>
|
这里需要将expandablelistview的groupindicator属性设置为@null,不使用其自带的展开图标; 。
grouplistfragment.java 加载列表的页面 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
|
package
com.eric.grouplistdemo;
import
java.util.arraylist;
import
java.util.hashmap;
import
java.util.list;
import
java.util.map;
import
org.json.jsonarray;
import
org.json.jsonexception;
import
org.json.jsonobject;
import
android.r.integer;
import
android.app.fragment;
import
android.content.context;
import
android.content.sharedpreferences;
import
android.content.sharedpreferences.editor;
import
android.os.bundle;
import
android.util.log;
import
android.view.layoutinflater;
import
android.view.view;
import
android.view.view.onclicklistener;
import
android.view.viewgroup;
import
android.widget.adapterview;
import
android.widget.edittext;
import
android.widget.expandablelistview;
import
android.widget.imageview;
import
android.widget.toast;
public
class
grouplistfragment
extends
fragment{
private
view view;
private
expandablelistview expandablelistview;
public
static
myadapter adapter;
public
static
list<string> parentlist;
public
static
map<string,list<string>> map;
private
modifydialog dialog;
private
edittext edit_modify;
private
imageview image_add;
private
int
currentgroup,currentchild;
public
static
sharedpreferences sp;
public
static
editor editor;
public
static
string datamap,dataparentlist;
@override
public
view oncreateview(layoutinflater inflater, viewgroup container,
bundle savedinstancestate) {
view = inflater.inflate(r.layout.fragment_group_list, container,
false
);
expandablelistview = (expandablelistview) view.findviewbyid(r.id.expandablelistview);
image_add = (imageview) view.findviewbyid(r.id.image_add);
image_add.setonclicklistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
alertadddialog(getactivity(),
"新增组"
);
}
});
initdata();
adapter =
new
myadapter(getactivity().getapplicationcontext(), parentlist, map);
expandablelistview.setadapter(adapter);
//设置子项点击事件
myonclicklistener mylistener =
new
myonclicklistener();
expandablelistview.setonchildclicklistener(mylistener);
//设置长按点击事件
myonlongclicklistener mylonglistener =
new
myonlongclicklistener();
expandablelistview.setonitemlongclicklistener(mylonglistener);
return
view;
}
public
void
initdata(){
map =
new
hashmap<string, list<string>>();
parentlist =
new
arraylist<string>();
sp = getactivity().getapplicationcontext().getsharedpreferences(
"spfile"
, getactivity().mode_private);
datamap = sp.getstring(
"datamap"
,
null
);
dataparentlist = sp.getstring(
"dataparentlist"
,
null
);
if
(datamap ==
null
|| dataparentlist ==
null
){
parentlist =
new
arraylist<string>();
parentlist.add(
"客厅"
);
parentlist.add(
"厨房"
);
parentlist.add(
"卧室"
);
list<string> list1 =
new
arraylist<string>();
list1.add(
"客厅空调"
);
list1.add(
"客厅电视"
);
list1.add(
"客厅电灯"
);
map.put(
"客厅"
, list1);
list<string> list2 =
new
arraylist<string>();
list2.add(
"厨房油烟机"
);
list2.add(
"厨房电灯"
);
list2.add(
"厨房电器"
);
map.put(
"厨房"
, list2);
list<string> list3 =
new
arraylist<string>();
list3.add(
"卧室空调"
);
list3.add(
"卧室灯光"
);
list3.add(
"卧室电视"
);
map.put(
"卧室"
, list3);
}
else
{
try
{
//初始化parentlist
jsonarray jsonarray =
new
jsonarray(dataparentlist);
for
(
int
i =
0
; i < jsonarray.length(); i++) {
parentlist.add(jsonarray.get(i).tostring());
}
//初始化map
jsonobject jsonobject =
new
jsonobject(datamap);
for
(
int
i =
0
; i < jsonobject.length(); i++) {
string key = jsonobject.getstring(parentlist.get(i));
jsonarray array =
new
jsonarray(key);
list<string> list =
new
arraylist<string>();
for
(
int
j =
0
; j < array.length(); j++) {
list.add(array.get(j).tostring());
}
map.put(parentlist.get(i), list);
}
log.d(
"eric"
,
"①:"
+map+
"②:"
+parentlist);
}
catch
(jsonexception e) {
e.printstacktrace();
log.e(
"eric"
,
"string转map或list出错"
+e);
}
}
log.e(
"eric"
, datamap+
"!&&!"
+dataparentlist);
savedata();
}
//自定义点击监听事件
public
class
myonclicklistener
implements
expandablelistview.onchildclicklistener{
@override
public
boolean
onchildclick(expandablelistview parent, view v,
int
groupposition,
int
childposition,
long
id) {
string str =
"choose"
+groupposition+
"-"
+childposition;
toast.maketext(getactivity(), str, toast.length_short).show();
return
false
;
}
}
//自定义长按监听事件
public
class
myonlongclicklistener
implements
adapterview.onitemlongclicklistener{
@override
public
boolean
onitemlongclick(adapterview<?> parent, view view,
int
position,
long
id) {
//长按子项
if
(expandablelistview.getpackedpositiontype(id) == expandablelistview.packed_position_type_child){
long
packedpos = ((expandablelistview) parent).getexpandablelistposition(position);
int
groupposition = expandablelistview.getpackedpositiongroup(packedpos);
int
childposition = expandablelistview.getpackedpositionchild(packedpos);
currentgroup = groupposition;
currentchild = childposition;
string str = (string)adapter.getchild(groupposition, childposition);
alertmodifydialog(
"修改此项名称"
,str);
toast.maketext(getactivity(),str,toast.length_short).show();
return
true
;
//长按组
}
else
if
(expandablelistview.getpackedpositiontype(id) == expandablelistview.packed_position_type_group){
long
packedpos = ((expandablelistview) parent).getexpandablelistposition(position);
int
groupposition = expandablelistview.getpackedpositiongroup(packedpos);
int
childposition = expandablelistview.getpackedpositionchild(packedpos);
currentgroup = groupposition;
currentchild = childposition;
string group = parentlist.get(groupposition);
alertmodifydialog(
"修改组名称"
, group);
string str = (string)adapter.getgroup(groupposition);
toast.maketext(getactivity(),str,toast.length_short).show();
}
return
false
;
}
}
//新增组
public
static
void
addgroup(string newgroupname){
parentlist.add(newgroupname);
list<string> list =
new
arraylist<string>();
map.put(newgroupname, list);
adapter.notifydatasetchanged();
savedata();
}
//新增子项到指定组
public
static
void
addchild(
int
groupposition, string newchildname){
string groupname = parentlist.get(groupposition);
list<string> list = map.get(groupname);
list.add(newchildname);
adapter.notifydatasetchanged();
savedata();
}
//删除指定组
public
static
void
deletegroup(
int
grouppos){
string groupname = parentlist.get(grouppos);
map.remove(groupname);
parentlist.remove(grouppos);
adapter.notifydatasetchanged();
savedata();
}
//删除指定子项
public
static
void
deletechild(
int
grouppos,
int
childpos){
string groupname = parentlist.get(grouppos);
list<string> list = map.get(groupname);
list.remove(childpos);
adapter.notifydatasetchanged();
savedata();
}
//修改该项名称
public
void
modifyname(
int
groupposition,
int
childposition, string modifyname){
toast.maketext(getactivity(), string.valueof(groupposition)+
'-'
+string.valueof(childposition), toast.length_short).show();
if
(childposition<
0
){
//修改组名称
string groupname = parentlist.get(groupposition);
if
(!groupname.equals(modifyname)){
map.put(modifyname, map.get(groupname));
map.remove(groupname);
parentlist.set(groupposition, modifyname);
}
}
else
{
//修改子项名称
string group = parentlist.get(groupposition);
list<string> list =map.get(group);
list.set(childposition, modifyname);
map.put(group, list);
}
adapter.notifydatasetchanged();
savedata();
}
//弹修改对话框
public
void
alertmodifydialog(string title, string name){
dialog =
new
modifydialog(getactivity(), title, name);
edit_modify = dialog.getedittext();
dialog.setonclickcommitlistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
modifyname(currentgroup, currentchild, edit_modify.gettext().tostring());
dialog.dismiss();
}
});
dialog.show();
}
//弹新增组对话框
public
void
alertadddialog(context context, string title){
dialog =
new
modifydialog(context, title,
null
);
edit_modify = dialog.getedittext();
dialog.setonclickcommitlistener(
new
onclicklistener() {
@override
public
void
onclick(view v) {
addgroup(edit_modify.gettext().tostring());
dialog.dismiss();
}
});
dialog.show();
}
//保存数据
public
static
void
savedata(){
jsonobject jsonobject =
new
jsonobject(map);
datamap = jsonobject.tostring();
dataparentlist = parentlist.tostring();
editor = sp.edit();
editor.putstring(
"datamap"
, datamap);
editor.putstring(
"dataparentlist"
, dataparentlist);
editor.commit();
}
}
|
内容有点多,一个个来:
初始化fragment页面函数oncreateview()
首先,要进行layout布局fragment_group_list.xml加载,获取相应控件的实例,expandablelistview列表控件以及添加组图标image_add,添加组图标添加点击事件;调用initdata()方法进行组数据parentlist和组对应子项map的初始化;然后,实例化adapter传入parentlist和map数据到自定义适配器myadapter中,并将其绑定到expandablelistview上;最后,给expandablelistview添加自定义子项点击事件监听器,组项和子项长按事件监听器; 。
初始化数据函数initdata():该函数通过sharereference来保存数据; 。
首先,实例化parentlist和map,从sharereference中获取到保存的string类型的parentlist和map实际数据,赋值到datamap和dataparentlist中,若当中数据不存在,默认返回null,第一次运行程序的时候肯定是没有数据的,故进行判断,若没获取到数据,那就给parentlist和map赋值“客厅”、“厨房”、“卧室”等一系列数据;如果有数据的话,那就得进行数据的转换,因为之前保存的string类型数据,parentlist初始化:将dataparentlist转换为jsonarray类型,通过循环将数据赋值到parentlist中;同理,将datamap转换为jsonobject类型,通过两层for循环将数据赋值到map中.
自定义点击子项监听其类myonclicklistener:实现expandablelistview.onchildclicklistener接口,这里就简单的进行toast操作,读者可以修改为跳转等其他自定义功能; 。
自定义长按组项或子项监听器类myonlongclicklistener:实现adapterview.onitemlongclicklistener接口,通过调用expandablelistview的getpackedpositiontype()方法来判断此时长按的是组项还是子项;这里将长按组和子项分离出来,方便根据功能修改;无论是组项还是子项长按后,都调用alertmodifydialog()弹修改对话框,传入当前项的名称; 新增组addgroup函数:将传递过来的newgroupname,添加parentlist中,且定义一个空的list,绑定newgroupname,将这对string和list,添加到map中;最后,调用adapter.notifydatasetchanged()刷新列表,调用savedata()保存数据到sharereference; 。
同理,新增子项到指定组addchild(),删除指定组deletegroup(),删除指定子项deletechild(),都是对parentlist和map进行操作,最后刷新列表和保存数据; 。
修改该项名称modifyname():通过传递过来childposition进行判断,当修改项为组项时,childposition的值为-1,以此区分组项和子项;这里遇到一个问题,当组项提交的名称与原名称相同会报错,故添加一个判断,仅提交的名称不同时才进行修改操作;修改的具体实现还是对parentlist和map的操作,以修改组项为例,同新增组,添加一个modifyname的组,其对应的list为原来组名对应的list数据,然后再将原来的groupname组及其对应的list删除,实现修改;最后同样要刷新列表和保存数据; 。
弹修改对话框alertmodifydialog()函数:首先对自定义的dialog进行实例化,初始化标题和输入框中的数据;调用getedittext()函数获取输入框实例,添加提交按钮点击事件,调用modifyname方法传入当前组和子项数据,以及输入框中提交的文本; 弹新增组对话框alertadddialog()函数:同样,实例化dialog,获取输入框控件,点击事件中调用addgroup()方法添加数据; 。
保存数据savedata()函数:将parentlist和map数据转化为string类型,分别赋值,保存至sharereference的editor中并提交; 。
以上就是本文的全部内容,希望对大家的学习有所帮助.
最后此篇关于Android仿QQ好友列表分组实现增删改及持久化的文章就讲到这里了,如果你想了解更多关于Android仿QQ好友列表分组实现增删改及持久化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!