listview實現點擊條目上的箭頭展開隱藏菜單。


效果如下圖,當點擊listview中的小三角時,顯示出下面布局,再點隱藏, 點擊其他條目的三角時,上一個展開的條目隱藏的同時展開當前條目。

思路是在item布局中放入展開菜單的布局,並設置狀態為隱藏,然后再適配器的getview方法中控制其顯示和隱藏,具體請查看代碼。

主布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.create.qdocumentimtest.Main2Activity">


    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="70dp">

        <ImageView
            android:id="@+id/imageview"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:src="@drawable/logo" />

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@id/imageview"
            android:text="這個是測試用條目" />

        <ImageView
            android:id="@+id/checkbox"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:background="@drawable/right_icon_selector"
            android:layout_marginRight="10dp"
            android:clickable="true"
            />

    </RelativeLayout>

    <include layout="@layout/item_hide_layout"
        />


</LinearLayout>

include中就是隱藏的布局,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#bcb9b9"
android:id="@+id/ll_hide"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:visibility="gone"//設置初始時隱藏狀態。
    >

<TextView
    android:id="@+id/hide_1"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="加密" />

<TextView
    android:id="@+id/hide_2"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="解密" />

<TextView
    android:id="@+id/hide_3"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="分享" />

<TextView
    android:id="@+id/hide_4"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="刪除" />

<TextView
    android:id="@+id/hide_5"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:text="屬性" />


</LinearLayout>

activity代碼:

package com.create.qdocumentimtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class Main2Activity extends AppCompatActivity {
    private ListView listview;
    private ArrayList<String> list;
    public int clickPosition = -1;
    public Boolean flag = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        listview = (ListView) findViewById(R.id.listview);
        list = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            list.add("我是第" + i + "個條目");
        }
        adapter = new MyAdapter();
        listview.setAdapter(adapter);
    }

    private MyAdapter adapter;

    class MyAdapter extends BaseAdapter implements View.OnClickListener {


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

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

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

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final MyViewHolder vh;
            if (convertView == null) {
                convertView = View.inflate(Main2Activity.this, R.layout.item_layout, null);
                vh = new MyViewHolder(convertView);
                convertView.setTag(vh);
            } else {
                vh = (MyViewHolder) convertView.getTag();
            }
            vh.tv_test.setText(list.get(position));
            //刷新adapter的時候,getview重新執行,此時對在點擊中標記的position做處理
            if (clickPosition == position) {//當條目為剛才點擊的條目時
                if (vh.selectorImg.isSelected()) {//當條目狀態圖標為選中時,說明該條目處於展開狀態,此時讓它隱藏,並切換狀態圖標的狀態。
                    vh.selectorImg.setSelected(false);
                    vh.ll_hide.setVisibility(View.GONE);
                    Log.e("listview","if執行");
                   clickPosition=-1;//隱藏布局后需要把標記的position去除掉,否則,滑動listview讓該條目划出屏幕范圍,
                    // 當該條目重新進入屏幕后,會重新恢復原來的顯示狀態。經過打log可知每次else都執行一次 (條目第二次進入屏幕時會在getview中尋找他自己的狀態,相當於重新執行一次getview) 
                    //因為每次滑動的時候沒標記得position填充會執行click
                } else {//當狀態條目處於未選中時,說明條目處於未展開狀態,此時讓他展開。同時切換狀態圖標的狀態。
                    vh.selectorImg.setSelected(true);
                    vh.ll_hide.setVisibility(View.VISIBLE);

                    Log.e("listview","else執行");
                }
//                ObjectAnimator//
//                        .ofInt(vh.ll_hide, "rotationX", 0.0F, 360.0F)//
//                        .setDuration(500)//
//                        .start();
                // vh.selectorImg.setSelected(true);
            } else {//當填充的條目position不是剛才點擊所標記的position時,讓其隱藏,狀態圖標為false。

                //每次滑動的時候沒標記得position填充會執行此處,把狀態改變。所以如果在以上的if (vh.selectorImg.isSelected()) {}中不設置clickPosition=-1;則條目再次進入屏幕后,還是會進入clickposition==position的邏輯中
                //而之前的滑動(未標記條目的填充)時,執行此處邏輯,已經把狀態圖片的selected置為false。所以上面的else中的邏輯會在標記過的條目第二次進入屏幕時執行,如果之前的狀態是顯示,是沒什么影響的,再顯示一次而已,用戶看不出來,但是如果是隱藏狀態,就會被重新顯示出來
                vh.ll_hide.setVisibility(View.GONE);
                vh.selectorImg.setSelected(false);

                Log.e("listview","狀態改變");
            }
            vh.hide_1.setOnClickListener(this);
            vh.hide_2.setOnClickListener(this);
            vh.hide_3.setOnClickListener(this);
            vh.hide_4.setOnClickListener(this);
            vh.hide_5.setOnClickListener(this);
            vh.selectorImg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(Main2Activity.this, "被點了", Toast.LENGTH_SHORT).show();
                    clickPosition = position;//記錄點擊的position
                    notifyDataSetChanged();//刷新adapter重新填充條目。在重新填充的過程中,被記錄的position會做展開或隱藏的動作,具體的判斷看上面代碼
               //在此處需要明確的一點是,當adapter執行刷新操作時,整個getview方法會重新執行,也就是條目重新做一次初始化被填充數據。
                    //所以標記position,不會對條目產生影響,執行刷新后 ,條目重新填充當,填充至所標記的position時,我們對他處理,達到展開和隱藏的目的。
                 //明確這一點后,每次點擊代碼執行邏輯就是 onclick()---》getview()
                }
            });
            return convertView;
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.hide_1:
                    Toast.makeText(Main2Activity.this, "加密", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.hide_2:
                    Toast.makeText(Main2Activity.this, "解密", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.hide_3:
                    Toast.makeText(Main2Activity.this, "分享", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.hide_4:
                    Toast.makeText(Main2Activity.this, "刪除", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.hide_5:
                    Toast.makeText(Main2Activity.this, "屬性", Toast.LENGTH_SHORT).show();
                    break;
            }
        }


        class MyViewHolder {
            View itemView;
            TextView tv_test;
            TextView hide_1, hide_2, hide_3, hide_4, hide_5;
            ImageView selectorImg;
            LinearLayout ll_hide;

            public MyViewHolder(View itemView) {
                this.itemView = itemView;
                tv_test = (TextView) itemView.findViewById(R.id.tv_test);
                selectorImg = (ImageView) itemView.findViewById(R.id.checkbox);
                hide_1 = (TextView) itemView.findViewById(R.id.hide_1);
                hide_2 = (TextView) itemView.findViewById(R.id.hide_2);
                hide_3 = (TextView) itemView.findViewById(R.id.hide_3);
                hide_4 = (TextView) itemView.findViewById(R.id.hide_4);
                hide_5 = (TextView) itemView.findViewById(R.id.hide_5);
                ll_hide = (LinearLayout) itemView.findViewById(R.id.ll_hide);
            }
        }
    }


}

目前沒有加入動畫效果,所以點擊顯示的狀態有點生硬,后續處理會加入展開和隱藏的上下平移動畫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM