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