gpt4 book ai didi

c# - 同一个 RelativeLayout 中的多个 ListView

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:12 25 4
gpt4 key购买 nike

我有一个正在尝试开发的应用程序。在应用程序的一种布局中,我有多个 ListView 组件。大纲如下所示:

<ScrollView>
<RelativeLayout>
<TextView />
<TextView />
<ListView />
<ListView />
<ListView />
<Button />
</RelativeLayout>
</ScrollView>

三个独立的 ListView 组件列出了 3 种不同类型的项目。我的问题来了,当用 ScrollView 封装时,ListView 决定每个只显示 1 个项目,然后落入它们的滚动行为。我更喜欢让他们显示所有项目,并让 ScrollView 进行滚动。这可能吗?

我在这里阅读了一些其他问题,似乎惯例是不在每个布局中使用多个 ListView。如果可能的话,我宁愿完成这项工作,因为列出的 3 个单独项目是相关的,并且一起显示很有意义。

最佳答案

ListView 主要是为滚动而设计的。 ListView使用回收机制,当item数量较多(相对于屏幕尺寸)时滚动更流畅。如果您希望您的 ListView 一次显示所有项目,您实际上并不需要 ListView。请改用 LinearLayout。我猜你正在使用列表适配器来填充你的列表。因此,您可以通过使用自定义 setAdapter() 方法来扩展 LinearLayout 并利用您的适配器。这是我为不可滚动列表创建的类。

public class NonScrollableListView extends LinearLayout {
private BaseAdapter mAdapter;
private AdapterDataSetObserver mDataSetObserver;

public NonScrollableListView(Context context) {
super(context);
}

public NonScrollableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public NonScrollableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if(mAdapter != null && mDataSetObserver != null){
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
}
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(mAdapter != null && mDataSetObserver != null){
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
}

public void setAdapter(BaseAdapter adapter) {
this.mAdapter = adapter;

if(mAdapter != null && mDataSetObserver != null){
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}

mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);

mDataSetObserver.onChanged();
}

private void fillChildViews(){
if(mAdapter != null){
int requiredChilrenCount = mAdapter.getCount();
int currentChildrenCount = getChildCount();

for(int i = 0; i < requiredChilrenCount; i++){
View nextChild = getChildAt(i);
View nextChildToAdd = mAdapter.getView(i, nextChild, this);
nextChildToAdd.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

if(nextChild == null){
addView(nextChildToAdd);
}
}

//Remove remaining child views if any
for(int i = requiredChilrenCount; i < currentChildrenCount; i++){
//The length of the children list changes so need to get it at each iteration
removeViewAt(getChildCount() - 1);
}
}
else{
removeAllViews();
}
}

private class AdapterDataSetObserver extends DataSetObserver{
@Override
public void onChanged() {
fillChildViews();
}
}
}

您可以像使用 ListView 一样使用它。请注意,项目数量预计相对较少。否则您将遇到性能问题。

关于c# - 同一个 RelativeLayout 中的多个 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13639569/

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