TreeListVew+PullToRefreshListView结合使用
来源:互联网 发布:程序员退休后怎么办 编辑:程序博客网 时间:2024/06/05 21:56
因为项目中有个管控区域的功能需要用到树形列表功能,于是在网上找了demo,看到了张鸿洋写了一个类似功能的demo,就参考一下,完成此功能,后续因为服务器数据不定时间会变化,要提供个刷新功能,以便于可以实时得到最新的数据,所以就想起能否和pulltorefreshlistview结合使用呢?做个下拉刷新,岂不是更好,然后就有研究了一下修改treelistview的部分代码完成了这个功能,对于treelistview不明白的可以去看张鸿洋博客http://blog.csdn.net/lmj623565791/article/details/40212367
pulltorefreshlistview的使用方法可以去github看https://github.com/chrisbanes/Android-PullToRefresh/tree/master/library
我把APK和源代码上传,可以安装看效果
下载地址:http://download.csdn.net/detail/csdn576038874/9853363
因为列表中需要有选中和未选中的状态的功能,所以我们添加一个TreeNodeChecked标签来标识item的选中和未选中
/** * @项目名: gdmsaec-app * @包名:com.winfo.gdmsaec.app.view.tree * @类名:TreeNodeChecked * @创建者:wenjie * @创建时间:2015-12-4下午3:30:34 * @描述:TODO * * @svn版本:$Rev: 601 $ * @更新人:$Author: wenjie $ * @更新时间:$Date: 2015-12-04 16:18:26 +0800 (Fri, 04 Dec 2015) $ * @更新描述:TODO */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TreeNodeChecked {}以下是treeview源码类,我也直接贴出来吧,
package wenjie.winfo.com.widget.treeview;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TreeNodeId{}
package wenjie.winfo.com.widget.treeview;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TreeNodeLabel{}
package wenjie.winfo.com.widget.treeview;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TreeNodePid{}
node类这里新增isChecked
package wenjie.winfo.com.widget.treeview;import java.util.ArrayList;import java.util.List;/** * * @author 00 */public class Node{private boolean isChecked;public boolean isChecked() {return isChecked;}public void setChecked(boolean isChecked) {this.isChecked = isChecked;}private String desc;public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}private String id;/** * 根节点pId为0 */private String pId = 0+"";private String name;/** * 当前的级别 */private int level;/** * 是否展开 */private boolean isExpand = false;private int icon;/** * 下一级的子Node */private List<Node> children = new ArrayList<Node>();/** * 父Node */private Node parent;public Node(){}public Node(String id, String pId, String name,boolean isChecked){super();this.id = id;this.pId = pId;this.name = name;this.isChecked = isChecked;}public int getIcon(){return icon;}public void setIcon(int icon){this.icon = icon;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getpId() {return pId;}public void setpId(String pId) {this.pId = pId;}public String getName(){return name;}public void setName(String name){this.name = name;}public void setLevel(int level){this.level = level;}public boolean isExpand(){return isExpand;}public List<Node> getChildren(){return children;}public void setChildren(List<Node> children){this.children = children;}public Node getParent(){return parent;}public void setParent(Node parent){this.parent = parent;}/** * 是否为跟节点 * * @return */public boolean isRoot(){return parent == null;}/** * 判断父节点是否展开 * * @return */public boolean isParentExpand(){if (parent == null)return false;return parent.isExpand();}/** * 是否是叶子界点 * * @return */public boolean isLeaf(){return children.size() == 0;}/** * 获取level */public int getLevel(){return parent == null ? 0 : parent.getLevel() + 1;}/** * 设置展开 * * @param isExpand */public void setExpand(boolean isExpand){this.isExpand = isExpand;if (!isExpand){for (Node node : children){node.setExpand(isExpand);}}}}
treeHelper类有部分参照着改动,具体看代码
package wenjie.winfo.com.widget.treeview;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import wenjie.winfo.com.R;/** * * @author 00 */public class TreeHelper{/** * 传入我们的普通bean,转化为我们排序后的Node * * @param datas * @param defaultExpandLevel * @return * @throws IllegalArgumentException * @throws IllegalAccessException */public static <T> List<Node> getSortedNodes(List<T> datas,int defaultExpandLevel) throws IllegalArgumentException,IllegalAccessException{List<Node> result = new ArrayList<Node>();// 将用户数据转化为List<Node>List<Node> nodes = convetData2Node(datas);// 拿到根节点List<Node> rootNodes = getRootNodes(nodes);// 排序以及设置Node间关系for (Node node : rootNodes){addNode(result, node, defaultExpandLevel, 1);}return result;}/** * 过滤出所有可见的Node * * @param nodes * @return */public static List<Node> filterVisibleNode(List<Node> nodes){List<Node> result = new ArrayList<Node>();for (Node node : nodes){// 如果为跟节点,或者上层目录为展开状态if (node.isRoot() || node.isParentExpand()){setNodeIcon(node);result.add(node);}}return result;}/** * 将我们的数据转化为树的节点 * 我们的数据有isChecked是否被选中的属性 来回显用户之前的选择,所以在这里我们吧 数据转转成node节点数据 带上手否被选中isChecked这样的话 * 我们只需要专心操作我们的数据就好了 不用再管node,node和我们的数据是关联起来的,数据变化node也会变化 * 所以我们加上TreeNodeChecked注解 同id,pid和label一样 利用注解和反射将数据的isChecked的值赋值给node * @param datas * @return * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException */private static <T> List<Node> convetData2Node(List<T> datas)throws IllegalArgumentException, IllegalAccessException{List<Node> nodes = new ArrayList<Node>();Node node = null;for (T t : datas){String id = null;String pId = null;boolean isChecked = false;String label = null;Class<? extends Object> clazz = t.getClass();Field[] declaredFields = clazz.getDeclaredFields();for (Field f : declaredFields){if (f.getAnnotation(TreeNodeId.class) != null){f.setAccessible(true);id = (String) f.get(t);}if (f.getAnnotation(TreeNodePid.class) != null){f.setAccessible(true);pId = (String) f.get(t);}if (f.getAnnotation(TreeNodeLabel.class) != null){f.setAccessible(true);label = (String) f.get(t);}if(f.getAnnotation(TreeNodeChecked.class) != null){f.setAccessible(true);isChecked = f.getBoolean(t);}if (id != null && pId != null && label != null){break;}}node = new Node(id, pId, label,isChecked);nodes.add(node);}/** * 设置Node间,父子关系;让每两个节点都比较一次,即可设置其中的关系 */for (int i = 0; i < nodes.size(); i++){Node n = nodes.get(i);for (int j = i + 1; j < nodes.size(); j++){Node m = nodes.get(j);if (m.getpId().equals( n.getId())){n.getChildren().add(m);m.setParent(n);} else if (m.getId().equals(n.getpId())){m.getChildren().add(n);n.setParent(m);}}}// 设置图片for (Node n : nodes){setNodeIcon(n);}return nodes;}private static List<Node> getRootNodes(List<Node> nodes){List<Node> root = new ArrayList<Node>();for (Node node : nodes){if (node.isRoot())root.add(node);}return root;}/** * 把一个节点上的所有的内容都挂上去 */private static void addNode(List<Node> nodes, Node node,int defaultExpandLeval, int currentLevel){nodes.add(node);if (defaultExpandLeval >= currentLevel){node.setExpand(true);}if (node.isLeaf())return;for (int i = 0; i < node.getChildren().size(); i++){addNode(nodes, node.getChildren().get(i), defaultExpandLeval,currentLevel + 1);}}/** * 设置节点的图标 * * @param node */private static void setNodeIcon(Node node){if (node.getLevel() ==0 && node.isExpand()){node.setIcon(R.mipmap.control_botom);} else if (node.getLevel() ==0 && !node.isExpand()){node.setIcon(R.mipmap.control_right);}else if(node.getLevel() ==1 && node.isExpand()){node.setIcon(R.mipmap.node_ec);}else if(node.getLevel() ==1 && !node.isExpand()){node.setIcon(R.mipmap.node_ex);}elsenode.setIcon(R.mipmap.control_dec);}}
package wenjie.winfo.com.widget.treeview;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import com.handmark.pulltorefresh.library.PullToRefreshListView;import java.util.List;/** * * @author 00 * * @param <T> */public abstract class TreeListViewAdapter<T> extends BaseAdapter{protected Context mContext;/** * 存储所有可见的Node */protected List<Node> mNodes;protected LayoutInflater mInflater; protected List<T> datas;/** * 存储所有的Node */protected List<Node> mAllNodes;/** * 点击的回调接口 */private OnTreeNodeClickListener onTreeNodeClickListener;public interface OnTreeNodeClickListener{void onClick(Node node, int position);}public void setOnTreeNodeClickListener(OnTreeNodeClickListener onTreeNodeClickListener){this.onTreeNodeClickListener = onTreeNodeClickListener;}protected void referesh()throws IllegalArgumentException,IllegalAccessException{/** * 对所有的Node进行排序 */mAllNodes = TreeHelper.getSortedNodes(datas, 0);/** * 过滤出可见的Node */mNodes = TreeHelper.filterVisibleNode(mAllNodes);notifyDataSetChanged();}/** * * @param mTree * @param context * @param datas * @param defaultExpandLevel * 默认展开几级树 * @throws IllegalArgumentException * @throws IllegalAccessException */public TreeListViewAdapter(PullToRefreshListView mTree, Context context, List<T> datas, int defaultExpandLevel) throws IllegalArgumentException,IllegalAccessException{mContext = context;/** * 对所有的Node进行排序 */mAllNodes = TreeHelper.getSortedNodes(datas, defaultExpandLevel);/** * 过滤出可见的Node */mNodes = TreeHelper.filterVisibleNode(mAllNodes);mInflater = LayoutInflater.from(context);/** * 设置节点点击时,可以展开以及关闭;并且将ItemClick事件继续往外公布 */mTree.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id){position = position - 1;expandOrCollapse(position);if (onTreeNodeClickListener != null){onTreeNodeClickListener.onClick(mNodes.get(position),position);}}});}/** * 相应ListView的点击事件 展开或关闭某节点 * * @param position */private void expandOrCollapse(int position){Node n = mNodes.get(position);if (n != null)// 排除传入参数错误异常{if (!n.isLeaf()){n.setExpand(!n.isExpand());mNodes = TreeHelper.filterVisibleNode(mAllNodes);notifyDataSetChanged();// 刷新视图}}}@Overridepublic int getCount(){return mNodes.size();}@Overridepublic Object getItem(int position){return mNodes.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){Node node = mNodes.get(position);convertView = getConvertView(node, position, convertView, parent);// 设置内边距convertView.setPadding(node.getLevel() * 30, 3, 3, 3);return convertView;}public abstract View getConvertView(Node node, int position,View convertView, ViewGroup parent);}
数据实体类
package wenjie.winfo.com;import java.io.Serializable;import java.util.List;import wenjie.winfo.com.widget.treeview.TreeNodeChecked;import wenjie.winfo.com.widget.treeview.TreeNodeId;import wenjie.winfo.com.widget.treeview.TreeNodeLabel;import wenjie.winfo.com.widget.treeview.TreeNodePid;/** * @项目名: gdmsaec-app * @包名: com.winfo.gdmsaec.app.domain.controlarea * @类名: ControlArea * @创建者: wenjie * @创建时间: 2015-11-18下午1:22:01 * @描述: 管控区域列表模型 * @svn版本: $Rev: 1768 $ * @更新人: $Author: wenjie $ * @更新时间: $Date: 2016-03-22 16:42:54 +0800 (Tue, 22 Mar 2016) $ * @更新描述: TODO */public class ControlArea implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * id */ @TreeNodeId private String id; /** * 父节点的名称 */ @TreeNodePid private String pId; /** * 显示的名称 */ @TreeNodeLabel private String text; /** * 是否被选中 */ @TreeNodeChecked private boolean isChecked; private List<ControlArea> children; public List<ControlArea> getChildren() { return children; } public void setChildren(List<ControlArea> children) { this.children = children; } public boolean isChecked() { return isChecked; } public void setChecked(boolean isChecked) { this.isChecked = isChecked; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getpId() { return pId; } public void setpId(String pId) { this.pId = pId; } public String getText() { return text; } public void setText(String text) { this.text = text; }}
package wenjie.winfo.com;import android.content.Context;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.handmark.pulltorefresh.library.PullToRefreshListView;import java.util.List;import wenjie.winfo.com.widget.treeview.Node;import wenjie.winfo.com.widget.treeview.TreeListViewAdapter;/** * 管控区域的列表适配器 * * @param <T> * @author 00 */public class ControlAreaAdapter<T> extends TreeListViewAdapter<T> { private OnCheckBoxClickListener onCheckBoxClickListener; public interface OnCheckBoxClickListener { void onClik(String id, String lx, boolean isChecked); } public void setOnCheckBoxClickListener(OnCheckBoxClickListener onCheckBoxClickListener) { this.onCheckBoxClickListener = onCheckBoxClickListener; } private OnMessageClickListenner onMessageClickListenner; public interface OnMessageClickListenner { void onClik(String id, String lx); } public void setOnMessageClickListenner(OnMessageClickListenner onMessageClickListenner) { this.onMessageClickListenner = onMessageClickListenner; } public ControlAreaAdapter(PullToRefreshListView mTree, Context context, List<T> datas, int defaultExpandLevel) throws IllegalArgumentException, IllegalAccessException { super(mTree, context, datas, defaultExpandLevel); } @Override public View getConvertView(final Node node, final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.control_area_item, parent, false); viewHolder = new ViewHolder(); viewHolder.icon = (ImageView) convertView.findViewById(R.id.treenode_icon); viewHolder.label = (TextView) convertView.findViewById(R.id.treenode_label); viewHolder.ivCheckBox = (ImageView) convertView.findViewById(R.id.id_control_icon); viewHolder.line = convertView.findViewById(R.id.control_line); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.icon.setVisibility(View.VISIBLE); viewHolder.icon.setImageResource(node.getIcon()); if (node.isChecked() && node.isLeaf()) { viewHolder.ivCheckBox.setVisibility(View.VISIBLE); } else { viewHolder.ivCheckBox.setVisibility(View.GONE); } if(node.isLeaf()){ viewHolder.line.setVisibility(View.VISIBLE); }else{ viewHolder.line.setVisibility(View.GONE); } /** * 这里需要把viewHolder.checkBox 赋值给 CheckBox 不然内部类无法访问 因为内部类访问必须为final的 而viewHolder不能是final 所以 吧他复制出来给 * 另外一个checkbox拿来使用 * 并且 这里我们不能用checkbox的 (setOnCheckedChangeListener)选中状态改变的监听方法 * 因为我们需要的是 在checkbox 点击为选中的时候 才调用接口查询数据,不然在lsitView中checkbox复用时,会一直调用setOnCheckedChangeListener * 这个事件,只要被选中了 就会执行请求,不符合要求 *///final ImageView box = viewHolder.checkBox;//viewHolder.checkBox.setOnClickListener(new OnClickListener() {//@Override//public void onClick(View v) {////boolean isChecked = box.isChecked();////node.setChecked(isChecked);//try {//String id = node.getId();////List<ControlArea> db_data = db.findAll(Selector.from(ControlArea.class).where(WhereBuilder.b("id", "=", id)));////ControlArea mControlArea = db_data.get(0);////把已勾选的的选项保存在ControlArea中////mControlArea.setChecked(isChecked);////db.update(mControlArea, WhereBuilder.b("id", "=", id), "isChecked");//String lx = node.getParent().getName();//onCheckBoxClickListener.onClik(id ,lx,true);////} catch (Exception e) {//e.printStackTrace();//}//}//}); if (node.isLeaf()) { viewHolder.icon.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String id = node.getId(); String lx = node.getParent().getName(); onMessageClickListenner.onClik(id, lx); } }); } else { viewHolder.icon.setOnClickListener(null); }//viewHolder.checkBox.setChecked(node.isChecked()); //onCheckBoxClickListener1.onClik(node.getId(),node.isChecked()); if (node.isRoot()) { viewHolder.label.setTextSize(16); } else if (node.isLeaf()) { viewHolder.label.setTextSize(14); } else { viewHolder.label.setTextSize(15); } viewHolder.label.setText(node.getName()); return convertView; } private class ViewHolder { public ImageView ivCheckBox; ImageView icon; TextView label; View line;//CheckBox checkBox; } public void referesh(List<T> datas) throws IllegalAccessException { this.datas = datas; referesh(); }}
package wenjie.winfo.com;import android.content.Context;import com.google.gson.Gson;import org.json.JSONException;import org.json.JSONObject;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;/** * json 和 实体类之间的相互转换 * @author 00 * */public class JsonUtil {/** * 将一个实体对象 转换成一个json字符串 提示对象中可包含集合 * @param t 实体类 * @return */public static <T> String beanToJson(T t){Gson gson = new Gson();return gson.toJson(t);}/** * 将一个json字符串 转换成一个实体类对象 可包含list * @param json * @param * @return */public static <T> T jsonToBean(String json,Class<T> class1) throws InstantiationException, IllegalAccessException{Gson gson = new Gson();T t;t=gson.fromJson(json, class1);return t;}/** * 将json字符串转换成一个json对象 * @param str * @return */public static JSONObject stringToJson(String str){try {return new JSONObject(str);} catch (JSONException e) {e.printStackTrace();return null;}}public static String getString(InputStream is){try {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){baos.write(buffer, 0, len);}byte[] byteArray = baos.toByteArray();//String str = new String(byteArray);return new String(byteArray,"utf-8");} catch (IOException e) {e.printStackTrace();}return "";}/** * 从assert文件夹中读取json文件,然后转化为json对象 * @throws Exception */public static JSONObject getJsonDataFromAssets(Context context,String jsonFileName) throws Exception{JSONObject mJsonObj;StringBuilder sb = new StringBuilder();InputStream is = context.getAssets().open(jsonFileName);int len;byte[] buf = new byte[1024];while ((len = is.read(buf)) != -1){sb.append(new String(buf, 0, len, "UTF-8"));}is.close();mJsonObj = new JSONObject(sb.toString());return mJsonObj;}}
Mainactivity
package wenjie.winfo.com;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.text.format.DateUtils;import android.widget.ListView;import android.widget.Toast;import com.handmark.pulltorefresh.library.ILoadingLayout;import com.handmark.pulltorefresh.library.PullToRefreshBase;import com.handmark.pulltorefresh.library.PullToRefreshListView;import org.json.JSONArray;import org.json.JSONObject;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import wenjie.winfo.com.widget.treeview.Node;import wenjie.winfo.com.widget.treeview.TreeListViewAdapter;public class MainActivity extends AppCompatActivity { /** * 显示数据的listview */ private PullToRefreshListView controlListview; /** * 管控区域列表数据的适配器 */ private ControlAreaAdapter<ControlArea> treeListViewAdapter; private ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dialog = new ProgressDialog(this); dialog.setTitle("提示"); dialog.setMessage("数据加载中..."); dialog.show(); // 初始化listView controlListview = (PullToRefreshListView) findViewById(R.id.listview_control_area); controlListview.setMode(PullToRefreshBase.Mode.PULL_FROM_START);//设置只能下拉刷新 init();//初始化 //设置listview的点击事件 controlListview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { //设置下拉时显示的日期和时间 String label = DateUtils.formatDateTime(MainActivity.this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:"+label);// dialog.show(); new RefereshAsyncTask().execute("newData.json");//刷新数据 } }); new DataAsyncTask().execute("data.json"); } private void init() { ILoadingLayout startLabels = controlListview .getLoadingLayoutProxy(true, false); startLabels.setPullLabel("下拉刷新");// 刚下拉时,显示的提示 startLabels.setRefreshingLabel("正在加载...");// 刷新时 startLabels.setReleaseLabel("放开刷新");// 下来达到一定距离时,显示的提示 } /** * 从assert文件夹中读取json文件,然后转化为json对象 * @throws Exception */ public JSONObject getJsonDataFromAssets(Context context, String jsonFileName) throws Exception{ JSONObject mJsonObj; StringBuilder sb = new StringBuilder(); InputStream is = context.getAssets().open(jsonFileName); int len; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1){ sb.append(new String(buf, 0, len, "UTF-8")); } is.close(); mJsonObj = new JSONObject(sb.toString()); return mJsonObj; } /** * 模拟异步加载数据 */ private class DataAsyncTask extends AsyncTask<String ,Integer , List<ControlArea>>{ @Override protected List<ControlArea> doInBackground(String... params) { try{ List<ControlArea> controlAreas = new ArrayList<>(); String jsonFileName = params[0]; JSONObject controlAreaJosn = getJsonDataFromAssets(MainActivity.this, jsonFileName); int result = controlAreaJosn.getInt("result"); if(result == 1){ JSONArray jsonArray = controlAreaJosn.getJSONArray("data"); //海事处 for (int i = 0; i < jsonArray.length(); i++) { JSONObject hscModel = jsonArray.getJSONObject(i); ControlArea controlArea = JsonUtil.jsonToBean(hscModel.toString(), ControlArea.class); controlAreas.add(controlArea); //海事处下面的类型 JSONArray qyJsonArray = hscModel.getJSONArray("children"); for (int j = 0; j < qyJsonArray.length(); j++) { JSONObject qyModel = qyJsonArray.getJSONObject(j); ControlArea controlArea2 = JsonUtil.jsonToBean(qyModel.toString(), ControlArea.class); controlAreas.add(controlArea2); //类型下面的管控区域 JSONArray jtJsonArray = qyModel.getJSONArray("children"); for (int k = 0; k < jtJsonArray.length(); k++) { JSONObject jtModel = jtJsonArray.getJSONObject(k); ControlArea controlArea3 = JsonUtil.jsonToBean(jtModel.toString(), ControlArea.class); controlAreas.add(controlArea3); } } } } return controlAreas; }catch (Exception e){ e.printStackTrace(); return null; } } @Override protected void onPostExecute(List<ControlArea> controlAreas) { super.onPostExecute(controlAreas); if(controlAreas != null){ dialog.dismiss(); try { treeListViewAdapter = new ControlAreaAdapter<>(controlListview, MainActivity.this, controlAreas, 0); controlListview.setAdapter(treeListViewAdapter); //每个item的点击事件 treeListViewAdapter.setOnTreeNodeClickListener(new TreeListViewAdapter.OnTreeNodeClickListener() { @Override public void onClick(Node node, int position) { if (node.isLeaf()) { if (node.isChecked())//取消 { String id = node.getId(); String lx = node.getParent().getName(); node.setChecked(false); treeListViewAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this , "取消选中----id="+id+"---lx="+lx , Toast.LENGTH_SHORT).show(); } else {//选中 String id = node.getId(); String lx = node.getParent().getName(); node.setChecked(true); treeListViewAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this , "选中----id="+id+"---lx="+lx , Toast.LENGTH_SHORT).show(); } } } }); //每个item前面的图标的点击事件 treeListViewAdapter.setOnMessageClickListenner(new ControlAreaAdapter.OnMessageClickListenner() { @Override public void onClik(String id, String lx) { Toast.makeText(MainActivity.this , "id="+id+"---lx="+lx , Toast.LENGTH_SHORT).show(); } }); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } /** * 模拟异步刷新数据 */ private class RefereshAsyncTask extends AsyncTask<String ,Integer , List<ControlArea>>{ @Override protected List<ControlArea> doInBackground(String... params) { try{ List<ControlArea> controlAreas = new ArrayList<>(); String jsonFileName = params[0]; JSONObject controlAreaJosn = getJsonDataFromAssets(MainActivity.this, jsonFileName); int result = controlAreaJosn.getInt("result"); if(result == 1){ JSONArray jsonArray = controlAreaJosn.getJSONArray("data"); //海事处 for (int i = 0; i < jsonArray.length(); i++) { JSONObject hscModel = jsonArray.getJSONObject(i); ControlArea controlArea = JsonUtil.jsonToBean(hscModel.toString(), ControlArea.class); controlAreas.add(controlArea); //海事处下面的类型 JSONArray qyJsonArray = hscModel.getJSONArray("children"); for (int j = 0; j < qyJsonArray.length(); j++) { JSONObject qyModel = qyJsonArray.getJSONObject(j); ControlArea controlArea2 = JsonUtil.jsonToBean(qyModel.toString(), ControlArea.class); controlAreas.add(controlArea2); //类型下面的管控区域 JSONArray jtJsonArray = qyModel.getJSONArray("children"); for (int k = 0; k < jtJsonArray.length(); k++) { JSONObject jtModel = jtJsonArray.getJSONObject(k); ControlArea controlArea3 = JsonUtil.jsonToBean(jtModel.toString(), ControlArea.class); controlAreas.add(controlArea3); } } } } return controlAreas; }catch (Exception e){ e.printStackTrace(); return null; } } @Override protected void onPostExecute(List<ControlArea> controlAreas) { super.onPostExecute(controlAreas); if(controlAreas != null){ dialog.dismiss(); try { treeListViewAdapter.referesh(controlAreas); controlListview.onRefreshComplete(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } }}
阅读全文
1 0
- TreeListVew+PullToRefreshListView结合使用
- PullToRefreshListView跟banner的结合使用
- Android_横向滑动菜单, HorizontalScrollView,Fragment,Viewpager结合使用 +pullToRefreshListView
- 开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用
- PullToRefreshListView 的使用
- PullToRefreshListView的简单使用
- Android--PullToRefreshListView的使用
- PullToRefreshListView 使用介绍
- PullToRefreshListView的使用
- PullToRefreshListView的使用
- Android PullToRefreshListView使用问题
- PullToRefreshListView库的使用
- PullToRefreshListView的使用
- PullToRefreshListView类库使用
- Pulltorefreshlistview刷新使用
- PullToRefreshListView简单使用
- pullToRefreshListView的使用
- PullToRefreshListView的使用
- java集合(5):HashSet源码分析
- USCAO-Section1.1 Greedy Gift Givers
- svn合并代码错误整理
- Windows常用的WIN+R快捷启动
- 中科爱讯WiFi探针模块TZ-1003产品简介
- TreeListVew+PullToRefreshListView结合使用
- 转载代理模式
- vue编写的移动端筛选条组件。
- tcpdump抓包分析详解
- 配置Apache服务器
- USACO section 1.3 Mixing Milk[贪心算法]
- Android系统权限和root权限
- VUE2.0 全套 demo 讲解 基础 5(class 与 style 绑定)
- I/O模型