volley网络请求框架+CheckBox实现全选及单选

来源:互联网 发布:mac 桌面文件太多 编辑:程序博客网 时间:2024/06/06 14:18

1:main  布局

<xlistview.bawei.com.xlistviewlibrary.XListView
        android:id="@+id/xlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:background="#c4c5c6"
        android:layout_height="50dp"
        android:gravity="center_vertical">
        <CheckBox
            android:id="@+id/cb"
            android:layout_marginLeft="30dp"
            android:button="@drawable/print_selector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/text"
            android:layout_marginLeft="30dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全选"/>
    </LinearLayout>

2:main     代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private CheckBox cb;
    private XListView xlv;
    private Handler handler=new Handler();
    private int startNum=0;
    private JSONArray data;
    private JSONArray jsonArray;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        xlv= (XListView) findViewById(R.id.xlv);
        cb= (CheckBox) findViewById(R.id.cb);

        cb.setOnClickListener(this);

        xlv.setPullRefreshEnable(true);
        xlv.setPullLoadEnable(true);
        xlv.setXListViewListener(new XListView.IXListViewListener() {
            @Override
            public void onRefresh() {
                startNum=0;
                getServerData();
                cb.setChecked(false);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        xlv.stopRefresh();
                    }
                },2000);
            }

            @Override
            public void onLoadMore() {
                startNum++;
                getServerData();
                cb.setChecked(false);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        xlv.stopLoadMore();
                    }
                },2000);
            }
        });
        //获取网络数据
        getServerData();

    }

    private void getServerData() {
        String url = "http://www.93.gov.cn/93app/data.do?" + "channelId=" + 0 + "&startNum=" + startNum;
        //采用volley网络请求框架
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest request=new StringRequest(url, new Response.Listener<String>() {
            @Override
            //响应成功
            public void onResponse(String s) {
                try {
                    JSONObject jsonObject=new JSONObject(s);
                    data = jsonObject.getJSONArray("data");
                    if(startNum==0){
                        jsonArray = new JSONArray();
                    }
                    for (int i=0;i<data.length();i++){
                        jsonArray.put(data.get(i));
                    }
                    //设置适配器
                    initAdapter(jsonArray);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            //响应失败
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        //把响应请求添加到响应队列
        queue.add(request);
    }

    private void initAdapter(JSONArray jsonArray) {
        if(adapter==null){
            adapter = new MyAdapter(this, jsonArray, new MyAdapter.OnClickListener() {
                @Override
                public void onCheck(boolean check) {
                    //全选
                    cb.setChecked(check);
                }
            });
            adapter.serData(jsonArray);
            xlv.setAdapter(adapter);
        }else{
            adapter.serData(jsonArray);
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.cb:
                boolean checked = ((CheckBox) v).isChecked();
                adapter.notfinycheck(checked);
                break;
        }
    }
}

3:适配器

public class MyAdapter extends BaseAdapter {
    private Context context;
    private JSONArray jsonArray;


    private Map<String, Boolean> map = new HashMap<>();
    //声明接口
    public OnClickListener listener;

    //定义接口
    public interface OnClickListener {
        void onCheck(boolean check);
    }

    //记录条目ID及保存状态
    public void setcheck(boolean checkFlag) {
        map.clear();
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                String id = jsonArray.getJSONObject(i).getString("ID");
                map.put(id, checkFlag);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }


    public void notfinycheck(boolean checkFlag) {
        setcheck(checkFlag);
        notifyDataSetChanged();
    }

    public MyAdapter(Context context, JSONArray jsonArray, OnClickListener listener) {
        this.context = context;
        this.jsonArray = jsonArray;
        this.listener = listener;
        setcheck(false);
    }

    public void serData(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
        setcheck(false);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return jsonArray != null ? jsonArray.length() : 0;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = View.inflate(context, R.layout.item, null);
        TextView tv = (TextView) convertView.findViewById(R.id.tv);
        ImageView image = (ImageView) convertView.findViewById(R.id.image);
        final CheckBox ch_item = (CheckBox) convertView.findViewById(R.id.ch_item);
        try {
            JSONObject jsonObject = jsonArray.getJSONObject(position);
            String title = jsonObject.getString("TITLE");
            String imageurl = jsonObject.getString("IMAGEURL");
            final String id = jsonObject.getString("ID");
            tv.setText(title);
            Picasso.with(context).load(imageurl).into(image);
            ch_item.setChecked(map.get(id));
            ch_item.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    boolean checked = ((CheckBox) v).isChecked();
                    map.put(id, checked);
                    boolean isChecked = true;
                    for (String key : map.keySet()) {
                        Boolean values = map.get(key);
                        if (!values) {
                            isChecked = false;
                            //取消全选
                            listener.onCheck(isChecked);
                            return;
                        }
                    }
                    if (isChecked) {
                        //全选
                        listener.onCheck(isChecked);
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return convertView;
    }
}

4:适配器布局

<CheckBox
        android:id="@+id/ch_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:button="@drawable/print_selector" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp" />

        <ImageView
            android:id="@+id/image"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="20dp" />
    </LinearLayout>

0 0
原创粉丝点击