业务需要,在父Listview里面(以下简称A)嵌套子listview(以下简称B),通俗来讲就是在A的item布局里面有一个B,先上效果图:
A的item布局文件很简单,
一个图片,
两个textview,
一个listview(B)。
B的布局文件是一个cornerimageview和一个textview。
需求是这样的,进入这个页面之后首先从后台得到部门名称,部门ID,部门人数,
然后在A的adapter里面通过部门ID得到相应部门的人员名称和头像。
废话不多,上代码:
首先是A的初始化等等:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // TODO: add setContentView(...) invocation ButterKnife.bind(this); } private class PhoneDepartmentHandler extends BaseHandler { @Override public void handleMessage(Message msg) { getDialog().cancel(); super.handleMessage(msg); super.setContext(PhoneGroupActivity.this); isTimeout = false; if (!getFlag()) { String str = (String) msg.obj; Log.e("PhoneDepartmentHandler", str); PhoneDepartments_Result result = new Gson().fromJson(str, PhoneDepartments_Result.class); phoneGroupListview.setAdapter(new PhonegroupAdapter(PhoneGroupActivity.this,result.getDepartment())); } } } private class PhoneDepartmentUsersForHandler extends BaseHandler { @Override public void handleMessage(Message msg) { getDialog().cancel(); super.handleMessage(msg); super.setContext(PhoneGroupActivity.this); isTimeout = false; if (!getFlag()) { String str = (String) msg.obj; Log.e("PhoneDepartmentUsersForHandler", str); } } } @Override protected void initContentView(Bundle savedInstanceState) { setContentView(R.layout.activity_phonegroup); super.setContext(PhoneGroupActivity.this); ButterKnife.bind(this); askHttp(); } protected void askHttp() { departments_request = new PhoneDepartments_Request(); super.askHttp(); departments_request.getResult(departmentHandler); } @Override public void onItemClick(AdapterView parent, View view, int position, long id) { startActivity(new Intent(PhoneGroupActivity.this, CallDetailActivity.class)); }
A的初始化和平常的一样,下面才是重头戏,也是本文难点所在:Aadapter和B的初始化import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import com.example.roi_walter.roisdk.request.PhoneDepartmentsUsersFor_Request; import com.example.roi_walter.roisdk.result.PhoneDepartmentsUsers_Result; import com.example.roi_walter.roisdk.result.PhoneDepartments_Result; import com.google.gson.Gson; import com.roi.wispower.R; import com.roi.wispower.view.activity.CallDetailActivity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; // 鄙人英文名~~~哈哈哈 /** * Created by ROI-Walter on 2016/8/12. */ public class PhonegroupAdapter extends BaseAdapter { private ViewHolder vh = null; private Context context; private List list; private Dialog dialog; private PhoneDepartmentUsersHandler departmentUsersHandler = new PhoneDepartmentUsersHandler(); // 后面给大家解释下为嘛用map装这些 // textview是来显示人数是多少的 private Map countMap = new HashMap<>(); // listview就是B private Map listViewMap = new HashMap<>(); // imageview是最左边的三角形符号,要旋转的 private Map imageViewMap = new HashMap<>(); // 点击这个layout要旋转三角形符号 private Map layoutMap = new HashMap<>(); //网络请求的Handler private class PhoneDepartmentUsersHandler extends Handler { @Override public void handleMessage(Message msg) { dialog.cancel(); super.handleMessage(msg); // 网络请求返回过来的字符串取到了 String str = (String) msg.obj; // 数据集合 List datalist = new ArrayList<>(); final PhoneDepartmentsUsers_Result result = new Gson().fromJson(str, PhoneDepartmentsUsers_Result.class); // 非空判断 if (result != null && result.getClientUsers() != null && result.getClientUsers().getClientUser() != null && result.getClientUsers().getClientUser().size() != 0) { datalist = result.getClientUsers().getClientUser(); } if (result.getClientUsers().getClientUser().size() != 0) { int position = result.getClientUsers().getClientUser().get(0).getDepartmentId(); Log.e("123", "position" + position); Home_PhonegroupLv_Adapter adapter = new Home_PhonegroupLv_Adapter(context, datalist); listViewMap.get(position).setAdapter( adapter); setListViewHeightBasedOnChildren(listViewMap.get(position)); layoutMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .getVisibility() == View.GONE) { imageViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .startAnimation(AnimationUtils.loadAnimation(context, R.anim.sanjiaoxing)); listViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .setVisibility(View.VISIBLE); } else { imageViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .startAnimation(AnimationUtils.loadAnimation(context, R.anim.sanjiaoxingback)); listViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .setVisibility(View.GONE); } } }); final List finalDatalist = datalist; listViewMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent intent = new Intent(context, CallDetailActivity.class); Bundle bundle = new Bundle(); if (finalDatalist != null && finalDatalist.size() != 0) { Log.e("toString", "datalist.get(position).getPic()--->" + finalDatalist.get(position).getPic() + "datalist.get(position).getName()--->" + finalDatalist.get(position).getName() + "datalist.get(position).getTitle()--->" + finalDatalist.get(position).getTitle() + "datalist.get(position).getName()--->" + finalDatalist.get(position).getName()); bundle.putString("pic", finalDatalist.get(position).getPic()); bundle.putString("username", finalDatalist.get(position).getName()); bundle.putString("job", finalDatalist.get(position).getTitle()); bundle.putString("name", finalDatalist.get(position).getName()); bundle.putString("phonenum", finalDatalist.get(position).getUserName()); intent.putExtras(bundle); } context.startActivity(intent); } }); } if (result.getClientUsers().getClientUser().size() != 0) { countMap.get(result.getClientUsers().getClientUser().get(0).getDepartmentId()) .setText(result.getCount() + "人"); } Log.e("PhonegroupAdapter", "list.size()" + datalist.size()); } } // 这里是我百度的,因为listview里面嵌套listview会引起滑动冲突和子listview显示不完全等等问题,所以要手动计算B的item高度 public void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); 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() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } // 这里是A的adapter public PhonegroupAdapter(Context context, List list) { this.context = context; this.list = list; dialog = new Dialog(context, R.style.dialog); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_phonegroup_listview, parent, false); vh = new ViewHolder(convertView); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); } // 部门名称 vh.groupName.setText(list.get(position).getDepartmentName()); // 人数 vh.groupCount.setText("人"); // 把相应的控件装进map集合中 listViewMap.put(list.get(position).getDepartmentId(), vh.phonegroupLv1); countMap.put(list.get(position).getDepartmentId(), vh.groupCount); imageViewMap.put(list.get(position).getDepartmentId(), vh.sanjiaoxing1); layoutMap.put(list.get(position).getDepartmentId(), vh.phonegroupLayout1); // 进行网络请求 askHttp(list.get(position).getDepartmentId()); return convertView; } // 网络请求 public void askHttp(int i) { PhoneDepartmentsUsersFor_Request phoneDepartmentsUsersFor_request = new PhoneDepartmentsUsersFor_Request("1", "20", "" + i); if (!dialog.isShowing()) { dialog.setContentView(R.layout.loading_dialog); dialog.setCanceledOnTouchOutside(false); dialog.show(); } phoneDepartmentsUsersFor_request.getResult(departmentUsersHandler); } static class ViewHolder { @Bind(R.id.sanjiaoxing1) ImageView sanjiaoxing1; @Bind(R.id.group_name) TextView groupName; @Bind(R.id.group_count) TextView groupCount; @Bind(R.id.phonegroup_layout1) LinearLayout phonegroupLayout1; @Bind(R.id.phonegroup_lv1) ListView phonegroupLv1; ViewHolder(View view) { ButterKnife.bind(this, view); } } }
最后的Badapter和平常的也差不多,这里聊一句题外话,本来加载图片是打算用picasso的,后来老是报错,google了一下貌似是版本的原因,果断用最原始的方式搞定它import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.roi_walter.roisdk.result.PhoneDepartmentsUsers_Result; import com.roi.wispower.R; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; /** * Created by ROI-Walter on 2016/8/12. */ public class Home_PhonegroupLv_Adapter extends BaseAdapter { private final Context mcontext; private LayoutInflater layoutInflater; private List list; private int count = 0; public Home_PhonegroupLv_Adapter(Context context, List list) { this.mcontext = context; this.list = list; //动态导入布局文件 layoutInflater = (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); Log.e("homephonegroupadapter", "--->" + list.size()); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (convertView == null || convertView.getTag() == null) { convertView = layoutInflater.inflate(R.layout.itemphone, null); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } if (list.size() != 0 && list != null) { Log.e("123",""+count); count++; viewHolder.itemPhoneTv.setText(list.get(position).getName()); if (list.get(position).getPic() != "" && list.get(position).getPic() != null) { new Thread(new Runnable() { @Override public void run() { if (checkURL(list.get(position).getPic())){ try { Bitmap bm = null; URL iconUrl = new URL(list.get(position).getPic()); URLConnection conn = iconUrl.openConnection(); HttpURLConnection http = (HttpURLConnection) conn; int length = http.getContentLength(); conn.connect(); // 获得图像的字符流 InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is, length); bm = BitmapFactory.decodeStream(bis); viewHolder.itemPhoneIv.setImageBitmap(bm); bis.close(); is.close();// 关闭流 } catch (Exception e) { e.printStackTrace(); } } } }).start(); } } viewHolder.itemPhoneTo.setVisibility(View.GONE); return convertView; } public boolean checkURL(String url) { boolean value = false; try { HttpURLConnection conn = (HttpURLConnection) new URL(url) .openConnection(); int code = conn.getResponseCode(); if (code != 200) { value = false; } else { value = true; } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return value; } static class ViewHolder { @Bind(R.id.item_phone_iv) ImageView itemPhoneIv; @Bind(R.id.item_phone_tv) TextView itemPhoneTv; @Bind(R.id.item_phone_to) ImageView itemPhoneTo; ViewHolder(View view) { ButterKnife.bind(this, view); } } }
在Aadapter里面有一段我没写注释,因为话都是连在一起的写注释感觉怪怪的这里为什么要把所有的控件都装到map集合里面去呢?(你猜你猜呀~猜对了我就告诉你~~~)
不闹了,首先要注意的是,这里的所有控件在每一个item里面都要有,而且每一个控件在每一个item的内容都不一样(我说的是大概意思,别跟我钻牛角尖说三角形就是一样的)。比如部门名称不一样,人数不一样,最关键的是,接下来的listview高度和内容也不一样。所以首先可以肯定的是这些控件的数据填充都是在我拉取到数据之后才进行操作的,换句话说就是在Handler里面进行数据填充的。那么有人会说了,你搞个全局变量不就行了?知道的肯定都知道不行,不知道的请左转百度baseadapter。这样一来,需要考虑的就是如何在Handler里面获取到控件对象了,而正好我的部门ID是唯一的,所以果断map不考虑其他的了。搞定了这些,接下来的就好办了1、在getView里面进行网络请求,返回的数据直接传到Handler里面。2、在Handler里面通过map获取到对应position的所有控件,然后填充数据,进行监听。3、在B中点击了条目会跳转到另外一个页面,这里就不多介绍了。我的时间主要是花在手动设置B的item的高度那一块,因为一开始加载之后B会显示一条,但是最多也就只有一条,我还一直以为是我这边哪里写错了,吃个饭回来才想起来有冲突这回事,上网一搜1分钟搞定了。嗯~~差不多就这样,我要去吃饭咯~苦逼的程序员屁股都坐疼了,有没有什么好的治痔疮(这才是本文最重点的重点)的办法麻烦各位大牛告诉我一下哈~另外文章如果有什么我写错了或者哪里没点到同志们没看懂的请留言或者私聊我都可以QQ 3291296564
listview嵌套listview,同时进行网络请求
最新推荐文章于 2024-05-29 15:38:22 发布