实现的效果是这个样子的
看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失的方法,指导下我,比较奇怪的时候刚开始初始化的时候子listview是默认不显示的,当点击父listview去张开子listview,父listview应该会再次刷新,但子listview展开是可以的,然后下一次更新数据源的时候子listview又会自动关闭,我猜应该是在刷新子listview的时候,父listview先更新完成,子listview的高度测量就没有对!
下面是我的源码
listview 嵌套listview都有个高度测量的问题,在更新的时候动态更新子listview就,下面是布局源码
然后是子listview item的布局代码
父listview 的adapter代码
package com.px.pxbatterymanage;
import java.util.ArrayList;
import com.px.pxbatterymanage.DevControlListAdapter.UpdateLister;
import com.px.svr.bean.GroupInfo;
import com.px.svr.data.StringChecker;
import com.px.ui.SwipeMenu;
import com.px.ui.SwipeMenuCreator;
import com.px.ui.SwipeMenuItem;
import com.px.ui.SwipeMenuListView;
import com.px.ui.SwipeMenuListView.OnMenuItemClickListener;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class GroupAdapter extends BaseAdapter {
private ArrayList mLeGroup;
private LayoutInflater mInflator;
private Context mContext;
private int mSelected;
public static Handler mHandler;
public GroupAdapter(Context context) {
// TODO Auto-generated constructor stub
this.mContext = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mLeGroup.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mLeGroup.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
/** * 更新数据 * * @param messageList */
public void setGroupinfoData(ArrayList blNodeList) {
if (null != blNodeList) {
this.mLeGroup = blNodeList;
} // if (null != messageList)
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_group, null);
viewHolder = new ViewHolder();
viewHolder.mDevNumberTextView = (TextView) convertView.findViewById(R.id.textView2);
viewHolder.mDevNameTextView = (TextView) convertView.findViewById(R.id.textView1);
viewHolder.listopen = (RelativeLayout) convertView.findViewById(R.id.listopen);
viewHolder.Deviceinfo = (SwipeMenuListView) convertView.findViewById(R.id.listView1);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
LinearLayout.LayoutParams listpar = (LinearLayout.LayoutParams)viewHolder.Deviceinfo.getLayoutParams();
final GroupInfo Groupinfo = mLeGroup.get(position);
viewHolder.mDevNameTextView.setText(Groupinfo.getName());
boolean isopen = GlobalVarData.GroupOpenMap.get(Groupinfo.getName()) == null?false:GlobalVarData.GroupOpenMap.get(Groupinfo.getName());
try {
viewHolder.adapter = new DevControlListAdapter(mContext);
viewHolder.adapter.mHandler = mHandler;
viewHolder.adapter.setBlNodeData(Groupinfo.getmGroupDown());
viewHolder.Deviceinfo.setAdapter(viewHolder.adapter);
//重点在这里动态修改子listview的高度,因为我这边子listview的item高度是50dp,这里可以自己修改
listpar.height = dp2px(50*viewHolder.adapter.getCount());
viewHolder.mDevNumberTextView.setText("("+viewHolder.adapter.getCount()+")");
viewHolder.adapter.notifyDataSetChanged();
viewHolder.Deviceinfo.setVisibility(View.VISIBLE);
} catch (Exception e) {
Log.e("error", e.toString());
}
viewHolder.adapter.setOnUpdateLister(new UpdateLister() {
@Override
public void update(int pos) {
if (pos == viewHolder.adapter.getCount() - 1) {
notifyDataSetChanged();
}
}
});
viewHolder.listopen.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if (GlobalVarData.GroupOpenMap.get(Groupinfo.getName()) != null && GlobalVarData.GroupOpenMap.get(Groupinfo.getName())) {
viewHolder.Deviceinfo.setVisibility(View.GONE);
GlobalVarData.GroupOpenMap.put(Groupinfo.getName(),false);
}else{
viewHolder.Deviceinfo.setVisibility(View.VISIBLE);
GlobalVarData.gCurCheckdGroupInfo = Groupinfo;
GlobalVarData.GroupOpenMap.put(Groupinfo.getName(),true);
}
}
});
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
SwipeMenuItem item2 = new SwipeMenuItem(mContext);
item2.setBackground(new ColorDrawable(Color.rgb(255, 0, 0)));
item2.setWidth(dp2px(60));
item2.setTitle("删除");
item2.setTitleColor(0xffffffff);
item2.setTitleColor(Color.parseColor("#ffffff"));
item2.setIcon(R.drawable.delete);
menu.addMenuItem(item2);
}
};
viewHolder.Deviceinfo.setMenuCreator(creator);
viewHolder.Deviceinfo.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(final int position, SwipeMenu menu, int index) {
switch (index) {
case 0:
showdelete(Groupinfo, position);
break;
}
return false;
}
});
return convertView;
}
public void setListViewHeight(ListView listView,GroupInfo groupinfo) {
//获取listView的adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0,len = Integer.valueOf(groupinfo.getCount()); i < len; i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (Integer.valueOf(groupinfo.getCount())- 1));
listView.setLayoutParams(params);
}
class ViewHolder {
TextView mDevNameTextView; // 名称
TextView mDevNumberTextView; // 在线数量
SwipeMenuListView Deviceinfo;
RelativeLayout listopen;
LinearLayout GroupLinear;
DevControlListAdapter adapter;
boolean Isopen = false;
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, GlobalVarData.gResources.getDisplayMetrics());
}
private int px2dp(int px) {
return (int) ((px*160)/GlobalVarData.gResources.getDisplayMetrics().density);
}
} 然后自己在根据要求补写个子listview的adapter就可以了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/136944.html