gpt4 book ai didi

android - ExpandableListView - 父项及其子项周围的边界

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:13 25 4
gpt4 key购买 nike

我有一个使用 ExpandableListView 的 View ,它周围和适配器中都有大量逻辑。例如,它看起来像这样

enter image description here

我需要用不同的皮肤显示相同的 View ,隐藏展开/折叠并且在父项及其子项周围有一个边框,就像这样

enter image description here

我看到属性为整个控件或仅父控件或单个子控件设置了边框,但没有在父控件及其子控件周围设置边框。

有没有人做过这样的事情?除了不使用 Expandablelistview 并重新创建 View 之外,我还能实现边框吗?

编辑 1:

Here is a gist有我正在尝试做的模板。

编辑 2:

我有一个解决方案,可以玩父子边界,

setting parent to            ┎─┒ 

and all-but-last children to ┃ ┃

and last child to ┖─┚

Here is the gist for the solution I have so far

我仍然对更好的解决方案持开放态度,并且会为任何比我的解决方案更简单的东西提供赏金。

最佳答案

编辑 所以我向 ExpandableListView 添加了 ItemDecoration 功能,它的工作原理与 RecyclerView 非常相似' s ItemDecoration,这里是代码:

子类化 ExpandableListView

public class ExpandableListViewItemDecoration extends ExpandableListView {
private List<ItemDecorationListView> itemDecorations = new ArrayList<>(1);

/* ... */

public void addItemDecoration(ItemDecorationListView item){
itemDecorations.add(item);
}

@Override
public void draw(Canvas canvas) {
super.draw(canvas);
final int count = itemDecorations.size();
for (int i = 0; i < count; i++) {
itemDecorations.get(i).onDrawOver(canvas, this);
}
}

元素装饰 ListView :

public abstract class ItemDecorationListView {

public void onDrawOver(Canvas c, ListView parent) {
}
}

ItemDecorator:

public class ItemDecoratorBorderListView extends ItemDecorationListView {

private final Paint paint = new Paint();
private final int size;

public ItemDecoratorBorderListView(int size, @ColorInt int color) {
this.size = size;
paint.setColor(color);
paint.setStrokeWidth(size);
paint.setStyle(Paint.Style.STROKE);
}

public static final String TAG = ItemDecoratorBorderListView.class.getSimpleName();

@Override
public void onDrawOver(Canvas c, ListView parent) {
super.onDrawOver(c, parent);
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
if (isHeader(child, parent, i)) {
for (int j = i + 1; j < childCount; j++) {
View childEnd = parent.getChildAt(j);
boolean end = isHeader(childEnd, parent, i) || j == childCount - 1;
if (end) {
if (BuildConfig.DEBUG) { Log.d(TAG, String.format(Locale.ENGLISH, "Draw called i: %d, j: %d", i, j)); }
childEnd = parent.getChildAt(j - 1);
if (j == childCount - 1) { childEnd = parent.getChildAt(j); }
float top = child.getTop() + child.getTranslationY() + size + child.getPaddingTop();
float bottom = childEnd.getBottom() + childEnd.getTranslationY() - size - childEnd
.getPaddingBottom();

float right = child.getRight() + child.getTranslationX() - size - child.getPaddingRight();
float left = child.getLeft() + child.getTranslationX() + size + child.getPaddingLeft();
c.drawRect(left, top, right, bottom, paint);
i = j - 1;
break;
}
}
}
}
}

public boolean isHeader(View child, ListView parent, int position) {
//You need to set an Id for your layout
return child.getId() == R.id.header;
}

只需将它添加到您的ExpandableListView:

expandableList.addItemDecoration(new ItemDecoratorBorderListView(
getResources().getDimensionPixelSize(R.dimen.stroke_size),
Color.GRAY
));

旧答案:

这是一个使用 RecyclerViewItemDecoration 的实现,在知道你被遗留代码困住之前我已经写了这个解决方案,所以我还是分享这个.

元素装饰:

public class ItemDecoratorBorder extends RecyclerView.ItemDecoration {

private final Paint paint = new Paint();
private final int size;

public ItemDecoratorBorder(int size, @ColorInt int color) {
this.size = size;
paint.setColor(color);
paint.setStrokeWidth(size);
paint.setStyle(Paint.Style.STROKE);
}

public static final String TAG = ItemDecoratorBorder.class.getSimpleName();

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
if (parent.getLayoutManager() == null) { return; }
int childCount = parent.getChildCount();
RecyclerView.LayoutManager lm = parent.getLayoutManager();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
if (isHeader(child, parent)) {
for (int j = i + 1; j < childCount; j++) {
View childEnd = parent.getChildAt(j);
boolean end = isHeader(childEnd, parent) || j == childCount - 1;
if (end) {
if (BuildConfig.DEBUG) { Log.d(TAG, String.format(Locale.ENGLISH, "Draw called i: %d, j: %d", i, j)); }
childEnd = parent.getChildAt(j - 1);
if (j == childCount - 1) {
childEnd = parent.getChildAt(j);
}
float top = child.getTop() + child.getTranslationY() + size + child.getPaddingTop();
float bottom = lm.getDecoratedBottom(childEnd) + childEnd.getTranslationY() - size - childEnd.getPaddingBottom();

float right = lm.getDecoratedRight(child) + child.getTranslationX() - size - child.getPaddingRight();
float left = lm.getDecoratedLeft(child) + child.getTranslationX() + size + child.getPaddingLeft();
c.drawRect(left, top, right, bottom, paint);
i = j - 1;
break;
}
}
}
}
}

public boolean isHeader(View child, RecyclerView parent) {
int viewType = parent.getLayoutManager().getItemViewType(child);
return viewType == R.layout.layout_header;
}

我正在使用 View 类型查找组的开始和结束位置,并在开始和结束位置周围绘制一个矩形。

代码可在 my github repo 获得

关于android - ExpandableListView - 父项及其子项周围的边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49408666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com