使用ExpandableListwebview优化以及怎么优化webview优化的显示减少内存占用

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
自定义了一个expandablelistview 想要删除其中的子项
list使用remove方法把list中的指定项删除了
11-09 21:04:20.585: I/MainActivity(13557): childData=[{child_text=second}, {child_text=third}]
但是在expandablelistview界面显示中,并没有变化,并且还有list溢出报错
private ExpandableListVie
private MyAdapter expandableA
private String [] groupStr={"第一组","第二组","第三组"};
private String [] childStr={"first","second","third"};
private List&Map&String, String&& groupData = new ArrayList&Map&String, String&&();
private List&Map&String, String&& childData = new ArrayList&Map&String, String&&();
initData()方法如下:
for(int i=0;i&3;i++){
//给标题赋值
Map&String,String& curGroupMap=new HashMap&String, String&();
curGroupMap.put("group_title", groupStr[i]);
groupData.add(curGroupMap);
//给子项赋值
Map&String,String& curChildMap=new HashMap&String,String&();
curChildMap.put("child_text", childStr[i]);
childData.add(curChildMap);
适配器代码如下:
class MyAdapter extends BaseExpandableListAdapter{
public Object getChild(int arg0, int arg1) {
// TODO Auto-generated method stub
return childData.get(arg0);
public long getChildId(int arg0, int arg1) {
// TODO Auto-generated method stub
return arg1;
public View getChildView(int arg0, int arg1, boolean arg2, View arg3,
ViewGroup arg4) {
// TODO Auto-generated method stub
if(arg3==null){
LayoutInflater inflater=(LayoutInflater)Main.
this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
arg3=inflater.inflate(R.layout.child,null);
TextView textview=(TextView)arg3.findViewById(R.id.childtext);
textview.setText(childStr[arg0]);
return arg3;
public int getChildrenCount(int arg0) {
// TODO Auto-generated method stub
return childData.get(arg0).size();
public Object getGroup(int arg0) {
// TODO Auto-generated method stub
return groupData.get(arg0);
public int getGroupCount() {
// TODO Auto-generated method stub
return groupData.size();
public long getGroupId(int arg0) {
// TODO Auto-generated method stub
return arg0;
public View getGroupView(int arg0, boolean arg1, View arg2,
ViewGroup arg3) {
// TODO Auto-generated method stub
if(arg2==null){
LayoutInflater inflater=(LayoutInflater)Main.
this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
arg2=inflater.inflate(R.layout.group, null);
TextView textview=(TextView)arg2.findViewById(R.id.grouptext);
textview.setText(groupStr[arg0]);
return arg2;
public boolean hasStableIds() {
// TODO Auto-generated method stub
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
检查你的数据定义,这种做法是非常危险的。我们要确保每个group item都有一个对应的child list,这个list为空,代表该group item没有子条目。可是你的定义呢?如果删除了"second",那么“thrid”到底是group1,还是group2的child呢?从代码中细究:
private String [] groupStr={"第一组","第二组","第三组"};
private String [] childStr={"first","second","third"};
private List&Map&String, String&& groupData = new ArrayList&Map&String, String&&();
private List&Map&String, String&& childData = new ArrayList&Map&String, String&&();
public int getChildrenCount(int arg0) {
// 这里的arg0,代表groupPosition,
// 所以,如果你删除了某个child元素,必然导致你的childData和groupData数量不对等。
// 当adapter试图为group2调用这个方法时,崩溃。
return childData.get(arg0).size();
public Object getChild(int arg0, int arg1) {
return childData.get(arg0);
// arg0代表groupPosition,arg1代表childPosition,
// 建议你把这两个参数名称从arg*改成有意义的名字。
// 修改了childData的定义后,这里需要改写成:
return childData.get(arg0).get(arg1);
那么,正确的数据定义和adapter数据初始化应该怎么做呢?看adapter的构造器:
public SimpleExpandableListAdapter(
List&? extends Map&String, ?&& groupData,
List&? extends List&? extends Map&String, ?&&& childData) {}
(1) 应该像这样定义child data:List&? extends List&? extends Map&String, ?&&&
private List createChildLists(int groupCount) {
ArrayList result = new ArrayList();
for( int i = 0 ; i & groupC i++ ) {
ArrayList secList = new ArrayList();
for( int n = 0 ; n & 3 ; n++ ) {
HashMap child = new HashMap();
child.put( "Sub Item", "Sub Item " + n );
secList.add( child );
result.add( secList );
(2) 然后这样删除child item:
List&Map&String, String&& childList = (List&Map&String, String&&)childData.get(groupPosition);
childList.remove(childPosition)
(3) 再然后 notifyDataSetChanged 通知adapter刷新View。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
删除数组里对应的值,然后调用MyAdapter.notifyDataSetChanged()
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
好好好# title
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:用ExpandableListView实现类似QQ好友列表 -
- ITeye博客
博客分类:
ExpandableListView是一个用来显示二级节点的listview。
qq好友列表中子列表上下移动时,父节点在顶端会始终显示,这里我们可以自定义一个view来充当这个父节点。
主布局文件qq_listview如下,其中当我们拖动列表时,系统默认拖动过程中列表背景是黑的,我们可以通过android:cacheColorHint="#"将其设置为透明,其中前两位是透明效果参数(00-99),后六位是颜色的设置。
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/default_bg_hdpi"&
&LinearLayout
android:id="@+id/gone_linear"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/expand_column_bg"
android:visibility="gone"
android:cacheColorHint="#"
&ImageView android:id="@+id/qq_list_imageview"
android:layout_width="wrap_content"
android:layout_height="30dip"
android:src="@drawable/narrow_select" /&
&TextView android:id="@+id/qq_list_textview"
android:layout_marginLeft="50dip"
android:layout_width="fill_parent" android:layout_height="wrap_content" /&
&/LinearLayout&
&FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"&
&ExpandableListView android:id="@+id/qq_listview"
android:cacheColorHint="#"
android:layout_width="fill_parent" android:layout_height="wrap_content" /&
&/FrameLayout&
&/LinearLayout&
如果我们想更换父节点打开和关闭时的箭头,可以先设置一个selector.xml
&?xml version="1.0" encoding="utf-8"?&
&selector xmlns:android="/apk/res/android"&
&item android:state_window_focused="false" android:drawable="@drawable/expand_column_bg_over" /&
&item android:state_pressed="true" android:drawable="@drawable/expand_column_bg" /&
&item android:state_pressed="false" android:drawable="@drawable/feedlistdividerbg"&&/item&
&/selector&
然后在代码中调用
elistview = (ExpandableListView)findViewById(R.id.qq_listview);
//替换ExpandableListView的打开关闭时的箭头图标
elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));
此外,我们还要设置父节点和子节点item的布局文件
父节点qq_list_parent.xml如下
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/expand_column_bg"&
&TextView android:id="@+id/parend"
android:layout_width="wrap_content"
android:layout_height="30dip"
android:layout_marginLeft="50dip"
&/LinearLayout&
子节点qq_listview_child.xml
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#"
&TextView android:id="@+id/child"
android:layout_width="wrap_content" android:layout_height="40dip"
android:layout_marginLeft="80dip"
&/LinearLayout&
java代码如下
package com.sy.android.
import java.util.ArrayL
import java.util.HashM
import java.util.M
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.AbsListV
import android.widget.AbsListView.OnScrollL
import android.widget.ExpandableListV
import android.widget.ExpandableListView.OnGroupCollapseL
import android.widget.ExpandableListView.OnGroupExpandL
import android.widget.LinearL
import android.widget.SimpleExpandableListA
import android.widget.TextV
import com.sy.android.testAndroid.R;
public class QQListView extends Activity
private static ArrayList&Map&String,String&& parentData = new ArrayList&Map&String,String&&();
private static ArrayList&ArrayList&Map&String,String&&& childData = new ArrayList&ArrayList&Map&String,String&&&();
private ExpandableListV
private TextV
*当前打开的父节点
private int the_group_expand_position=-1;
* 打开的父节点所与的子节点数
private int position_child_count=0;
* 是否有打开的父节点
private boolean isExpanding=
public void getData(){
for(int i=0; i&20;i++){
Map&String,String& map = new HashMap&String,String&();
map.put("parend", i+"");
parentData.add(map);
for(int i=0;i&20;i++){
ArrayList&Map&String,String&& child = new ArrayList&Map&String,String&&();
for(int j=0; j&20;j++){
Map&String,String& map = new HashMap&String,String&();
map.put("child", i+""+j);
child.add(map);
childData.add(child);
public void onCreate(Bundle saveBundle){
super.onCreate(saveBundle);
setContentView(R.layout.qq_listview);
elistview = (ExpandableListView)findViewById(R.id.qq_listview);
//替换ExpandableListView的打开关闭时的箭头图标
elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));
tv = (TextView)findViewById(R.id.qq_list_textview);
* 滑动子列表时在上方显示父节点的view
final LinearLayout linear = (LinearLayout)findViewById(R.id.gone_linear);
* 监听父节点打开的事件
elistview.setOnGroupExpandListener(new OnGroupExpandListener(){
public void onGroupExpand(int groupPosition) {
the_group_expand_position=groupP
position_child_count=childData.get(groupPosition).size();
isExpanding=
* 监听父节点关闭的事件
elistview.setOnGroupCollapseListener(new OnGroupCollapseListener(){
public void onGroupCollapse(int groupPosition) {
if(linear.getVisibility()==View.VISIBLE){
linear.setVisibility(View.GONE);
isExpanding=
linear.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
linear.setVisibility(View.GONE);
elistview.collapseGroup(the_group_expand_position);
* 通过setOnScrollListener来监听列表上下滑动时item显示和消失的事件
elistview.setOnScrollListener(new OnScrollListener(){
public void onScrollStateChanged(AbsListView view, int scrollState) {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(isExpanding){
// 当当前第一个item id小于打开的父节点id 或大于打开的父节点id和它的子节点总数之和时
if(firstVisibleItem&the_group_expand_position ||
firstVisibleItem&(the_group_expand_position+position_child_count)){
linear.setVisibility(View.GONE);
linear.setVisibility(View.VISIBLE);
tv.setText(((Map)parentData.get(the_group_expand_position)).get("parend").toString());
getData();
SimpleExpandableListAdapter selAdapter = new SimpleExpandableListAdapter(this,
parentData,
R.layout.qq_listview_parend_item,
new String[]{"parend"},
new int[]{R.id.parend},
childData,
R.layout.qq_liatview_child_item,
new String[]{"child"},
new int[]{R.id.child}
elistview.setAdapter(selAdapter);
实现的思路是通过setOnScrollListener来监听listview,从而获得显示在视图中的item的id,通过id的判断来决定显示在顶端的自定义的view是否显示
浏览 30226
浏览: 157611 次
能把源码发我邮箱吗 谢谢了
shishisssss
感觉不错啊,谢谢分享了
请问有源码么?看之前评论貌似有的
源码在哪里呢?谢谢今天看啥 热点:
解决Fragment中ExpandableListView刷新失败的绝招,expandablelistview
不知道有没有朋友遇到过这种问题,在一个fragment1添加的数据(确定已经添加到sqlite里面了),但是添加的数据要在另一个fragment2的expandableListView里面显示出来。这就设计到刷新的问题。
借鉴了前人的做法,其中感觉比较有好的做法是用异步处理的方式,在适配器外面声明一个Handler,然后在ExpandableListView构造方法里面接收消息,调用notifyDataSetChanged方法,按他人的说法这个只有group刷新了,child的数据没给刷出来。看api文档发现Group&的伸缩会
引起getChildView(int,&int,&boolean,&View,&ViewGroup)&&的运行,也就是说只要
伸缩一次就可以了!代码如下:
expandableList.collapseGroup(groupPosition);
expandableList.expandGroup(groupPosition);
连Adapter&都不用重写! 在fragment2里面写一个refresh方法利用handler发送消息以运行接收消息里面的notifyDataSetChanged方法通知适配器数据发生了改变。在fragment1通过getFragmentManager调用fragment2的refresh方法完成刷新操作。
试了下,还是不行。
将在手机调试的工程退出,再点击进去的时候列表的信息又全部正常显示出来了。曾经想过去人为地去控制Activity的生命周期,以达到想要的效果,不过感觉不是常规做法没去用。最后在fragment里用getActivity().recreate();页面闪一下,数据就弄出来了。原来其实很简单,Activity重新启动,所有的数据重新加载,新添加的数据当然会显示到ExpandableListView里面
相关搜索:
相关阅读:
相关频道:
Android教程最近更新还没有账号?
其他方式登录
滑动完成验证
重发验证码
手机短信验证码已发送,请查收!
有一位课程导师想与你聊聊
客服热线 400-862-8862

我要回帖

更多关于 webview优化 的文章

 

随机推荐