ListView嵌套ListView并实现全选计数与Search页面的数据同步

先上代码,原理后面梳理需要源码请戳

MainActivity类:

package com.example.teemo.check;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.example.teemo.check.adapter.ParentAdapter;
import com.example.teemo.check.app.CommonActivity;
import com.example.teemo.check.bean.Child;
import com.example.teemo.check.bean.ChildAdapterData;
import com.example.teemo.check.bean.EventData;
import com.example.teemo.check.bean.Group;
import com.example.teemo.check.bean.SearchData;

import org.greenrobot.eventbus.Subscribe;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends CommonActivity implements ParentAdapter.OnCountListener, ParentAdapter.OnRefresh {

        private ListView listView;
        ArrayList<Group> groups;
        Map<Group, Boolean> map = new HashMap<>();
        ParentAdapter adapter;

        ArrayList<Child> childs = new ArrayList<>(); // 传到搜索数据
        private Button bt_count;
        private ArrayList<String> idList;
        int amount;
        int typeServe;
        int totalCount;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            idList = new ArrayList<>();
            listView = (ListView) findViewById(R.id.listView_Parent);
            bt_count = (Button) findViewById(R.id.bt_count);
            groups = new ArrayList<>();
            initData();
            adapter = new ParentAdapter(groups, this, map);
            adapter.setOnCountListener(this);
            adapter.setOnRefresh(this);
            listView.setAdapter(adapter);
            bt_count.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int counts = 0;
                    idList.clear();
                    ArrayList<Group> list = adapter.getList();
                    for (int i = 0; i < list.size(); i++) {
                        Group group = list.get(i);
                        for (int k = 0; k < group.getChildrenCount(); k++) {
                            if (group.getChildren().get(k).getChecked()) {
                                counts++;   // 选中的总数量
                                idList.add(group.getChildren().get(k).getUserid()); // id的集合 (全部获取的是 adapter里的)
                            }
                        }
                    }
                    Toast.makeText(MainActivity.this, "已经选中" + counts, Toast.LENGTH_SHORT).show();
                }
            });
            genericFindViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent in = new Intent(getApplicationContext(), SearchActivity.class);
                    in.putParcelableArrayListExtra("search_list", childs);
                    startActivityForResult(in, 1);
                }
            });
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 1) {
                if (resultCode == 2) {  // resultCode == 2 代表取消 group里的 child的 item的checked  全部为false
                    for (int i = 0; i < groups.size(); i++) {
                        Group group = groups.get(i);
                        for (int k = 0; k < group.getChildren().size(); k++) {
                            ArrayList<Child> children = group.getChildren();
                            Child child = children.get(k);
                            child.setChecked(false);
                        }
                    }
                    adapter.setList(groups);
                } else {  // resultCode != 2 将search 选中的 添加进 集合中
                    ArrayList<ChildAdapterData> list = (ArrayList<ChildAdapterData>) data
                            .getSerializableExtra("list");
                    if (list != null && list.size() > 0) {
                        totalCount = 0;
                        for (int i = 0; i < groups.size(); i++) {
                            Group group = groups.get(i);
                            ArrayList<Child> children = group.getChildren();
                            for (int j = 0; j < children.size(); j++) {
                                Child child = children.get(j);
                                for (int k = 0; k < list.size(); k++) {
                                    Log.e("UserId", child.getUserid() + ",,,,,id:,," + list.get(k).id);
                                    if (child.getUserid().equals(list.get(k).id)) {
                                        children.get(j).setChecked(list.get(k).isCheck);
                                    }
                                }
                            }
                        }
                        adapter.setList(groups);
                    }
                }
            }
        }

        @Override
        protected boolean isBindEventBusHere() {
            return false;
        }

        private void initData() {
            int s = 0;
            for (int i = 0; i < 30; i++) {
                Group group = new Group("id" + i, "一级目录" + i);
                for (int j = 0; j < 3; j++) {
                    Child child = new Child("userid" + s, i + "下的二级目录" + j, "username" + j);
                    s++;
                    group.addChildrenItem(child);
                    childs.add(child);
                }
                map.put(group, true);
                groups.add(group);
            }
        }

        @Override
        public void onCountListener(int amount) {
            this.amount = amount;
            typeServe = amount;
            totalCount = amount;
//        Toast.makeText(MainActivity.this, "已选中" + (amount) + "个品类", Toast.LENGTH_SHORT)
//                .show();
        }

        @Override
        public void onRefresh(int position, boolean bon) {
            Group group = groups.get(position);
            map.put(group, bon);
            adapter.notifyDataSetChanged();
        }

    @Override
    public void onBackPressed() {
        //这里需要把最终改变后的groups保存到Application中,最终集合通过adapter.getList获取
        BaseApplication.getInstance().groups = adapter.getList();
        super.onBackPressed();
    }

}

SearchActivity类:

package com.example.teemo.check;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;

import com.example.teemo.check.adapter.SearchAdapter;
import com.example.teemo.check.app.ClearEditText;
import com.example.teemo.check.app.CommonActivity;
import com.example.teemo.check.bean.Child;
import com.example.teemo.check.bean.ChildAdapterData;
import com.example.teemo.check.bean.EventData;
import com.example.teemo.check.bean.SearchData;

import org.greenrobot.eventbus.Subscribe;

import java.util.ArrayList;
import java.util.List;

public class SearchActivity extends CommonActivity implements SearchAdapter.OnCountIdListener {

    ClearEditText edit;
    TextView text;
    ListView listView;
    private int t = 0;// 0 取消   1确定
    SearchAdapter adapter;
    List<ChildAdapterData> lists = new ArrayList<>();
    private ArrayList<Child> search_list;
    private SearchData mSearchData;
    private ArrayList<ChildAdapterData> filterDateList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        Intent intent = getIntent();
        search_list = intent.getParcelableArrayListExtra("search_list");
        lists = filledData();
        initView();
        genericFindViewById(R.id.search_text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (t == 0) {
                    setResult(2);
                    finish();
                } else {
                    onBackPressed();
                }
            }
        });
    }

    @Override
    protected boolean isBindEventBusHere() {
        return false;
    }

    private void initView() {
        edit = genericFindViewById(R.id.search_filter_edit);
        text = genericFindViewById(R.id.search_text);
        listView = genericFindViewById(R.id.search_list);

        adapter = new SearchAdapter(null, this);
        adapter.setOnCountIdListener(this);
        listView.setAdapter(adapter);

        edit.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                filterData(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

    private List<ChildAdapterData> filledData() {
        List<ChildAdapterData> mSortList = new ArrayList<>();
        if (search_list != null && search_list.size() > 0) {
            for (int i = 0; i < search_list.size(); i++) {
                ChildAdapterData sortModel = new ChildAdapterData();
                sortModel.title = search_list.get(i).getFullname();
                sortModel.id = search_list.get(i).getUserid();
                sortModel.isCheck = search_list.get(i).getChecked();
                mSortList.add(sortModel);
            }
        }
        return mSortList;
    }

    private void filterData(String filterStr) {
        if (filterDateList == null) {
            filterDateList = new ArrayList<>();
        }
        if (TextUtils.isEmpty(filterStr)) {
            filterDateList = null;
            t = 0;
            text.setText("取消");
        } else {
            t = 1;
            text.setText("确定");
            filterDateList.clear();
            for (ChildAdapterData sortModel : lists) {
                String name = sortModel.title;
                if (name.indexOf(filterStr.toString()) != -1) {
                    filterDateList.add(sortModel);
                }
            }
        }
        adapter.updateListView(filterDateList);
    }

    @Subscribe
    public void onEventMainThread(EventData event) {
        switch (event.getEventCode()) {
        }
    }

    // 返回键 将选中的list集合 回传到 main页面
    @Override
    public void onBackPressed() {
        ArrayList<ChildAdapterData> lists = adapter.getLists();
        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putSerializable("list", lists);
        intent.putExtras(bundle);
        setResult(Activity.RESULT_OK, intent);
        super.onBackPressed();
    }

    List<String> idList;

    @Override
    public void onCountIdListener(int count, List<String> idLists) {
//        showToast("搜索选中id = "+idLists.size());
        this.idList = idLists;
        mSearchData = new SearchData(count, idLists);
    }

}

最终集合通过,adapter.getList获取
有不懂的留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值