需要用到三方依赖: implementation 'com.google.android:flexbox:2.0.1'
使用的是其中的 FlexboxLayoutManager 布局管理器
public class FloorView extends LinearLayout {
private Context context;
private View widgetView;
private RecyclerView recyclerView;
private MyAdapter myAdapter;
private boolean isVis = true;//是否需要隐藏显示
private List<String> listAll = new ArrayList<>();
private List<String> listFirstLine = new ArrayList<>();
public FloorView(Context context) {
this(context, null);
}
public FloorView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public FloorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
widgetView = inflate(context, R.layout.widget_indicator_floor_view, this);
initRecylerView();
}
private void initRecylerView() {
recyclerView = widgetView.findViewById(R.id.rv_list);
//设置flexbox
FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context);
// layoutManager.setFlexDirection(FlexDirection.ROW);
// layoutManager.setJustifyContent(JustifyContent.FLEX_END);
recyclerView.setLayoutManager(layoutManager);
myAdapter = new MyAdapter();
myAdapter.setListData(listAll);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setAdapter(myAdapter);
}
public void addDisplayItem(List<String> lists, boolean isVis) {
this.isVis = isVis;
if (lists == null) {
return;
}
listAll.clear();
listAll.addAll(lists);
Log.e("FloorView", "listAll.size():" + listAll.size());
myAdapter.setListData(listAll);
myAdapter.notifyDataSetChanged();
}
//限制展示数量 点击展开 num是最多展示的数量
public void addDisplayItem(List<String> lists, int num) {
if (lists == null) {
return;
}
listAll.clear();
listAll.addAll(lists);
listFirstLine.clear();
listFirstLine.addAll(lists);
if (lists.size() > num) {
listFirstLine = listFirstLine.subList(0, num);
listFirstLine.set(num - 1, "....");
//setArrow(true);
myAdapter.setListData(listFirstLine);
myAdapter.notifyDataSetChanged();
} else {
myAdapter.setListData(listAll);
myAdapter.notifyDataSetChanged();
}
}
//展开或者折叠的箭头
public void setArrow(boolean isDown) {
if (isDown) {
myAdapter.setListData(listAll);
myAdapter.notifyDataSetChanged();
} else {
//ivArrow.setImageResource(R.drawable.arrow_up);
myAdapter.setListData(listFirstLine);
myAdapter.notifyDataSetChanged();
}
}
/**
* 用内部类来写adapter
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> contents;
public void setListData(List<String> lists) {
this.contents = lists;
}
//创建新View,被LayoutManager所调用
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_floor, viewGroup, false);
ViewHolder vh = new ViewHolder(view);
return vh;
}
//将数据与界面进行绑定的操作
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
viewHolder.mTextView.setText(contents.get(position));
if (isVis) {
if (viewHolder.mTextView.getText().toString().length() > 7) {
viewHolder.mTextView.setMaxEms(6);
viewHolder.mTextView.setMaxLines(1);
viewHolder.mTextView.setEllipsize(TextUtils.TruncateAt.END);
} else {
viewHolder.mTextView.setMaxEms(viewHolder.mTextView.getText().toString().length() + 1);
viewHolder.mTextView.setMaxLines(1);
}
}
viewHolder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (contents.get(position).equals("....")) {
setArrow(true);
} else if (contents.get(position).equals("收起")) {
setArrow(false);
}
}
});
}
//获取数据的数量
@Override
public int getItemCount() {
return contents.size();
}
//自定义的ViewHolder,持有每个Item的的所有界面元素
class ViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
ViewHolder(View view) {
super(view);
mTextView = view.findViewById(R.id.tv);
}
}
}
}
//下面是简单地布局文件
widget_indicator_floor_view
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"/>
// 适配器 item_floor
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:gravity="center"
android:paddingLeft="6dp"
android:paddingTop="3dp"
android:paddingRight="6dp"
android:paddingBottom="3dp"
android:text="标题"
android:textColor="#4a90e2"
android:textSize="12sp" />
//使用实例
int num=7;
List<String> stringList = new ArrayList<>();
if (dataBeanList.get(position).getTagList() != null && dataBeanList.get(position).getTagList().size() > 0) {
stringList.addAll(dataBeanList.get(position).getTagList());
if (dataBeanList.get(position).getTagList().size() > num-1) {
stringList.add("收起");
}
}
holder.floorView.addDisplayItem(stringList, num);