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行的代码