listview的可展开,显示隐藏 item 简单实现

1.首先理解一下可展开item


2.实现思路

在listview 的adapter中直接操作相关代码即可实现

在BaseAdapter 的 getview方法中肯定要根据某个东西来判定隐藏的view的visible是GONE还是VISIBIBLE

而这个东西肯定需要被设置,肯定是在被点击时要设置值,然后刷新adapter。

具体代码如下:

public class Exchange_Fragment_Adapter extends BaseAdapter {
    //数据
    private List<ExchangeGoods> exchanges;
    private Context context;
    //数据个数
    private int size;
    /*//用于记录点击的 Item 的 position,是控制 item 展开的核心
    private int currentItem = -1; //单项展开*/
    private boolean[] showControl; // 用一个布尔数组记录list中每个item是否要展开


    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case Constants.DATA_LOAD_OK:

                    break;
                case Constants.DATA_LOAD_ERROR:
                    //加载数据出错
                    break;
            }
        }
    };


    public Exchange_Fragment_Adapter(Context context, List<ExchangeGoods> exchangs) {
        this.context = context;
        this.exchanges = exchangs; //数据
        size = exchanges.size();
        showControl = new boolean[size]; // 构造器中初始化布尔数组
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflate = LayoutInflater.from(context);
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = inflate.inflate(R.layout.fragment_exchange_listview_item , null);
            holder = new ViewHolder();
            holder.showarea = convertView.findViewById(R.id.exchange_item_show_area);
            holder.hidearea = convertView.findViewById(R.id.exchange_item_hide_area);
            holder.name = convertView.findViewById(R.id.exchange_item_name);
            holder.show_detail = convertView.findViewById(R.id.exchange_item_show_detail);
            holder.viewpager = convertView.findViewById(R.id.exchange_item_viewpager);
            holder.brows = convertView.findViewById(R.id.exchange_item_brows);
            holder.time = convertView.findViewById(R.id.exchange_item_time);
            holder.breifs = convertView.findViewById(R.id.exchange_item_breifs);
            holder.owner_account = convertView.findViewById(R.id.exchange_item_owner_account);
            holder.owner_name = convertView.findViewById(R.id.exchange_item_owner_name);
            holder.exchangegoods = convertView.findViewById(R.id.exchange_item_exchangegoods);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        ExchangeGoods goods = exchanges.get(position);
        //给showdetail绑定值,好显示隐藏area
        holder.show_detail.setTag(position);
        //加载数据显示
        LoadDatas(goods , holder , inflate , position);

        if (showControl[position]){
            holder.hidearea.setVisibility(View.VISIBLE);
        } else {
            holder.hidearea.setVisibility(View.GONE);
        }
        holder.show_detail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //用 currentItem 记录点击位置
                int tag = (Integer) v.getTag();
                if (showControl[tag]) { //再次点击
                    showControl[tag] = false; //给 currentItem 一个无效值
                } else {
                    showControl[tag] = true;
                }
                //通知adapter数据改变需要重新加载
                notifyDataSetChanged(); //必须有的一步
            }
        });

        return convertView;
    }

    private void LoadDatas(ExchangeGoods goods, ViewHolder holder, LayoutInflater inflate , int position) {
        LoadView(goods, holder, inflate , position);
        //给viewpager三个页面 加载数据
    }

    private void LoadView(ExchangeGoods goods, ViewHolder holder, LayoutInflater inflate , int position){
        List<View> views = new ArrayList<>();
        View one = inflate.inflate(R.layout.viewpager_imagview_one , null);
        View two = inflate.inflate(R.layout.viewpager_imageview_two , null);
        View three = inflate.inflate(R.layout.viewpager_mediaplay_three , null);
        views.add(one);
        views.add(two);
        views.add(three);
        holder.one = one.findViewById(R.id.one);
        holder.two = two.findViewById(R.id.two);
        holder.three = three.findViewById(R.id.three);

        Load(holder , goods , position);

        LoadViewPager(holder , views);
    }

    //先把数据加载了
    private void Load(ViewHolder holder, ExchangeGoods goods , int position) {
        holder.brows.setText(goods.getNumber() + "次浏览");
        holder.name.setText(goods.getGoodsname());
        holder.time.setText(goods.getTime());
        holder.owner_name.setText(goods.getUsername());
        holder.breifs.setText(goods.getGoodsbreif());
        holder.exchangegoods.setText(goods.getYxname());
        //todo 三张图片 加一个视频
        if (position == 0){
            holder.one.setBackgroundColor(context.getResources().getColor(R.color.colorAccent));
        }
    }
    //再使用viewpager
    private void LoadViewPager(ViewHolder holder , List<View> views) {
        Exchange_Viewpager_Adapter adapter = new Exchange_Viewpager_Adapter(views);
        holder.viewpager.setAdapter(adapter);
        holder.viewpager.setCurrentItem(0);
    }


    private class ViewHolder {
        private LinearLayout showarea;

        private ViewPager viewpager;
        private TextView  brows;
        private TextView  name;
        private TextView  show_detail;
        private TextView time;
        private TextView breifs;
        private ImageView owner_account;
        private TextView owner_name;
        private TextView exchangegoods;

        private LinearLayout hidearea;

        private ImageView one;
        private ImageView two;
        private VideoView three;

    }

}
重点是77--95行的代码


猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/80277235