Android-樹(shù)形選擇列表

項(xiàng)目地址:https://github.com/QiaokeZ/Android_TreeViewDome
03C28F37B949973DE4A69A3CAF591830.2019-12-24 16_08_16.gif
TreeViewDataSource.java
public class TreeViewDataSource {

    private TreeViewDataSource() {
    }

    private List<TreeViewNode> elements = new ArrayList();
    private List<TreeViewNode> nodes;

    public TreeViewDataSource(List<TreeViewNode> nodes) {
        this.nodes = nodes;
        if (nodes == null) {
            nodes = new ArrayList();
        }
        collectElements(nodes);
    }

    private void collectElements(List<? extends TreeViewNode> nodes) {
        for (TreeViewNode node : nodes) {
            elements.add(node);
            if (node.isExpand == true && node.child != null && node.child.size() > 0) {
                collectElements(node.child);
            }
        }
    }

    public void updateNodes() {
        elements.clear();
        collectElements(nodes);
    }

    public List<? extends TreeViewNode> getElements() {
        return elements;
    }

    public List<? extends TreeViewNode> getNodes() {
        return nodes;
    }
}
TreeViewNode.java
public class TreeViewNode {

    public boolean isExpand;
    public List<TreeViewNode> child;
}
TestModel.java
public class TestModel extends TreeViewNode {

    public String name;
    public int maginLeft;
    public boolean isSelected;

    @Override
    public String toString() {
        return "name='" + name + '\'';
    }
}
如何使用
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private ListView listView;
    private ListViewAdapter adapter;
    private TreeViewDataSource dataSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        listView = findViewById(R.id.list);
        listView.setOnItemClickListener(this);
        adapter = new ListViewAdapter();
        listView.setAdapter(adapter);
    }

    public void add(View view) {
        TestModel node = new TestModel();
        node.name = "手機(jī)品牌";
        node.child = new ArrayList();

        TestModel node1 = new TestModel();
        node1.name = "Apple";
        node1.maginLeft = 100;
        node1.child = new ArrayList();
        node.child.add(node1);

        TestModel node2 = new TestModel();
        node2.name = "顏色";
        node2.maginLeft = 200;
        node2.child = new ArrayList();
        node1.child.add(node2);

        TestModel node3 = new TestModel();
        node3.name = "黑色";
        node3.maginLeft = 300;
        node3.child = new ArrayList();
        node2.child.add(node3);

        TestModel node4 = new TestModel();
        node4.name = "iPhoneX";
        node4.maginLeft = 300;
        node3.child.add(node4);

        List nodes = dataSource.getNodes();
        nodes.add(node);
        dataSource.updateNodes();
        adapter.notifyDataSetChanged();
    }

    public void show(View view) {
        List list = getSelectedNodes();
        Toast.makeText(this, list.toString(), Toast.LENGTH_LONG).show();
    }

    public List<TestModel> getSelectedNodes() {
        List result = new ArrayList();
        for (int i = 0; i < dataSource.getElements().size(); i++) {
            TestModel model = (TestModel) dataSource.getElements().get(i);
            if (model.isSelected) {
                result.add(model);
            }
        }
        return result;
    }

    private void initData() {
        List list = new ArrayList();

        TestModel node = new TestModel();
        node.name = "食物";
        node.child = new ArrayList();
        list.add(node);

        TestModel node1 = new TestModel();
        node1.name = "水果";
        node1.maginLeft = 100;
        node1.child = new ArrayList();
        node.child.add(node1);

        TestModel node10 = new TestModel();
        node10.name = "蘋果";
        node10.maginLeft = node1.maginLeft;
        node1.child.add(node10);

        TestModel node11 = new TestModel();
        node11.name = "香蕉";
        node11.maginLeft = node10.maginLeft;
        node1.child.add(node11);

        TestModel node12 = new TestModel();
        node12.name = "梨子";
        node12.maginLeft = node10.maginLeft;
        node1.child.add(node12);

        TestModel node2 = new TestModel();
        node2.name = "蔬菜";
        node2.maginLeft = node1.maginLeft;
        node2.child = new ArrayList();
        node.child.add(node2);

        TestModel node20 = new TestModel();
        node20.name = "白菜";
        node20.maginLeft = node1.maginLeft;
        node2.child.add(node20);

        TestModel node21 = new TestModel();
        node21.name = "西紅柿";
        node21.maginLeft = node1.maginLeft;
        node2.child.add(node21);

        TestModel node22 = new TestModel();
        node22.name = "胡蘿卜";
        node22.maginLeft = node1.maginLeft;
        node2.child.add(node22);

        TestModel node3 = new TestModel();
        node3.name = "肉類";
        node3.maginLeft = node1.maginLeft;
        node3.child = new ArrayList();
        node.child.add(node3);

        TestModel node30 = new TestModel();
        node30.name = "豬肉";
        node30.maginLeft = node1.maginLeft;
        node3.child.add(node30);

        TestModel node31 = new TestModel();
        node31.name = "魚(yú)肉";
        node31.maginLeft = node1.maginLeft;
        node3.child.add(node31);

        TestModel node32 = new TestModel();
        node32.name = "牛肉";
        node32.maginLeft = node1.maginLeft;
        node3.child.add(node32);

        dataSource = new TreeViewDataSource(list);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TestModel node = (TestModel) dataSource.getElements().get(position);
        node.isExpand = !node.isExpand;
        if (node.child == null) {
            node.isSelected = !node.isSelected;
            adapter.notifyItemChanged(listView, position);
        } else {
            dataSource.updateNodes();
            adapter.notifyDataSetChanged();
        }
    }

    class ListViewAdapter extends BaseListViewAdapter<BaseListViewAdapter.BaseListViewHolder> {

        @Override
        protected BaseListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_tree, parent, false);
            TreeViewHolder holder = new TreeViewHolder(view);
            return holder;
        }

        @Override
        protected void onBindViewHolder(BaseListViewHolder holder, final int position) {
            TestModel node = (TestModel) getItem(position);
            TreeViewHolder treeViewHolder = (TreeViewHolder) holder;
            treeViewHolder.textView.setText(node.name);
            treeViewHolder.itemView.setPadding(node.maginLeft, 0, 0, 0);

            //技能選擇開(kāi)關(guān)
            if (node.isSelected) {
                treeViewHolder.ivSelected.setImageDrawable(getResources().getDrawable((R.drawable.ic_yes)));
            } else {
                treeViewHolder.ivSelected.setImageDrawable(getResources().getDrawable((R.drawable.ic_no)));
            }

            //是否展開(kāi)
            if (node.isExpand) {
                treeViewHolder.ivExpand.setImageDrawable(getResources().getDrawable((R.drawable.arrow_down)));
            } else {
                treeViewHolder.ivExpand.setImageDrawable(getResources().getDrawable((R.drawable.arrow_right)));
            }

            if (node.child != null && node.child.size() > 0) {
                treeViewHolder.ivExpand.setVisibility(View.VISIBLE);
                treeViewHolder.ivSelected.setVisibility(View.INVISIBLE);
            } else {
                treeViewHolder.ivExpand.setVisibility(View.INVISIBLE);
                treeViewHolder.ivSelected.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public int getCount() {
            return dataSource.getElements().size();
        }

        @Override
        public Object getItem(int position) {
            return dataSource.getElements().get(position);
        }
    }

    class TreeViewHolder extends BaseListViewAdapter.BaseListViewHolder {

        public TextView textView;
        public ImageView ivSelected;
        public ImageView ivExpand;

        public TreeViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv);
            ivSelected = itemView.findViewById(R.id.iv_selected);
            ivExpand = itemView.findViewById(R.id.iv_expand);
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末难述,一起剝皮案震驚了整個(gè)濱河市延蟹,隨后出現(xiàn)的幾起案子胧卤,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窿给,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)率拒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門崩泡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人俏橘,你說(shuō)我怎么就攤上這事允华。” “怎么了寥掐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)磷蜀。 經(jīng)常有香客問(wèn)我召耘,道長(zhǎng),這世上最難降的妖魔是什么褐隆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任污它,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衫贬。我一直安慰自己德澈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布固惯。 她就那樣靜靜地躺著梆造,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葬毫。 梳的紋絲不亂的頭發(fā)上镇辉,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音贴捡,去河邊找鬼忽肛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烂斋,可吹牛的內(nèi)容都是我干的屹逛。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汛骂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼煎源!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起香缺,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤手销,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后图张,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锋拖,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年祸轮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽埃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡适袜,死狀恐怖柄错,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苦酱,我是刑警寧澤售貌,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站疫萤,受9級(jí)特大地震影響颂跨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扯饶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一恒削、第九天 我趴在偏房一處隱蔽的房頂上張望池颈。 院中可真熱鬧,春花似錦钓丰、人聲如沸躯砰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琢歇。三九已至,卻和暖如春则北,著一層夾襖步出監(jiān)牢的瞬間矿微,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工尚揣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涌矢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓快骗,卻偏偏與公主長(zhǎng)得像娜庇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子方篮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 請(qǐng)?jiān)试S我借鑒前輩們的東西~~~~ 感激不盡~~~~~ 以下為Android 框架排行榜 么么噠~ Android...
    嗯_(tái)新閱讀 2,020評(píng)論 3 32
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,967評(píng)論 1 3
  • 自己總結(jié)的Android開(kāi)源項(xiàng)目及庫(kù)名秀。 github排名https://github.com/trending,g...
    passiontim閱讀 2,532評(píng)論 1 26
  • 各種幫助類匯總:https://github.com/Blankj/AndroidUtilCode 常用的 ios...
    懦弱的me閱讀 1,218評(píng)論 0 51
  • 天橋燃起一片火焰,孟白跌下橋藕溅,橋上猛然響起九尾狐的長(zhǎng)嘯匕得。“雨……雪……”孟白的 身影漸漸模糊巾表,漸漸縮小汁掠,化...
    柒與白狐閱讀 86評(píng)論 0 3