我正在尝试将一个listview放入一个listviewitem中。内部的listview不应该是可滚动的,而是使用它所需的所有大小来显示它的所有行。有没有更好的方法来解决这个问题?表格,网格,...?我现在面临的问题是,内部的listview没有占用它所需的空间,所以它在第一个列表项的末尾被剪切。如果我尝试滚动,只有外部的listview正在滚动,这正是我想要的。

谢谢,我的最终解决方案是
LinearLayout layout = (LinearLayout) row.findViewById(R.id.LLBroadcasts);
layout.removeAllViews();
for (Item b : bs.getItems()) {
View child = _inflater.inflate(R.layout.item_row, null);
TextView tvTitle = (TextView) child.findViewById(R.id.TVItemTitle);
tvTitle.setText(b.getTitle());
TextView tvDesc = (TextView) child.findViewById(R.id.TVItemDescription);
tvDesc.setText(b.getDescription());
layout.addView(child);
}发布于 2012-07-25 23:23:51
来自安卓文档- Listview:ListView是一个显示可滚动项列表的视图组
您并不是真的想滚动内部列表视图,而是希望滚动外部列表视图。但是,我推测内部的listview可能会根据它所包含的元素数量而有所不同。
除了内部列表视图之外,还可以使用
查看此tutorial或查看Adding content to a linear layout dynamically?
对于线性布局(一些示例代码):
// access your linear layout
LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
// load the xml structure of your row
View child = getLayoutInflater().inflate(R.layout.row);
// now fill the row as you would do with listview
//e.g. (TextView) child.findViewById(...
...
// and than add it
layout.addView(child);您应该将线性布局保存在视图夹子中(请参见View Holder pattern)。我认为只有当当前行的内层行数少于重用的行数时,才需要使用removeAllViews(),因此我还会将行数保存在视图管理器中。
如果内部行的最大数量不是很高,您还可以考虑将它们缓存在视图持有者中,以避免膨胀和findByViewId (比方说在ArrayList中)。
发布于 2014-09-23 20:14:08
我的应用程序也有同样的问题,但我需要使用ListView,因为它是一个共享项目,我不想复制相等的组件。所以..。我只是通过编程修复了内部ListView的大小,以显示所有行和..瞧!问题已解决:
ViewGroup.LayoutParams layoutParams = innerListView.getLayoutParams();
layoutParams.height = (int) context.getResources().getDimension(R.dimen.rowheight) * innerListView.getCount();
innerListView.setLayoutParams(layoutParams);
CustomAdapter adapter = new CustomAdapter(context, blabla..);
innerListView.setAdapter(adapter);
rowListView.invalidate();发布于 2015-02-15 18:38:52
也许有人会发现我的解决方案很有用。它基于@ChrLipp并使用LinearLayout。
public class NotScrollableListView extends LinearLayout {
private ListAdapter adapter;
private DataChangeObserver dataChangeObserver;
private Drawable divider;
private int dividerHeight;
private List<View> reusableViews = new ArrayList<>();
public NotScrollableListView(Context context) {
super(context);
}
public NotScrollableListView(Context context, AttributeSet attrs) {
super(context, attrs);
setAttributes(attrs);
}
public NotScrollableListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setAttributes(attrs);
}
public ListAdapter getAdapter() {
return adapter;
}
public void setAdapter(ListAdapter adapter) {
if (this.adapter != null && dataChangeObserver != null) {
this.adapter.unregisterDataSetObserver(dataChangeObserver);
}
this.adapter = adapter;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (adapter != null) {
dataChangeObserver = new DataChangeObserver();
adapter.registerDataSetObserver(dataChangeObserver);
fillContents();
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (adapter != null) {
adapter.unregisterDataSetObserver(dataChangeObserver);
dataChangeObserver = null;
}
}
private void fillContents() {
// clearing contents
this.removeAllViews();
final int count = adapter.getCount(); // item count
final int reusableCount = reusableViews.size(); // count of cached reusable views
// calculating of divider properties
ViewGroup.LayoutParams dividerLayoutParams = null;
if (divider != null && dividerHeight > 0) {
dividerLayoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dividerHeight);
}
// adding items
for (int i = 0; i < count; i++) {
// adding item
View converView = null;
if (i < reusableCount) { // we have cached view
converView = reusableViews.get(i);
}
View view = adapter.getView(i, converView, this);
if (i >= reusableCount) { // caching view
reusableViews.add(view);
}
addView(view);
// adding divider
if (divider != null && dividerHeight > 0) {
if (i < count - 1) {
ImageView dividerView = new ImageView(getContext());
dividerView.setImageDrawable(divider);
dividerView.setLayoutParams(dividerLayoutParams);
addView(dividerView);
}
}
}
}
private void setAttributes(AttributeSet attributes) {
int[] dividerAttrs = new int[]{android.R.attr.divider, android.R.attr.dividerHeight};
TypedArray a = getContext().obtainStyledAttributes(attributes, dividerAttrs);
try {
divider = a.getDrawable(0);
dividerHeight = a.getDimensionPixelSize(1, 0);
} finally {
a.recycle();
}
setOrientation(VERTICAL);
}
private class DataChangeObserver extends DataSetObserver {
@Override
public void onChanged() {
super.onChanged();
fillContents();
}
@Override
public void onInvalidated() {
super.onInvalidated();
fillContents();
}
}
}
<com.sample.ui.view.NotScrollableListView
android:id="@+id/internalList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/list_divider_color"
android:dividerHeight="@dimen/list_divider_width"
/>https://stackoverflow.com/questions/11652814
复制相似问题