我有一个布局:
<LinearLayout>
<TextView/>
<LinearLayout> <-- needs to be a dynamic list
<JohnDoeView/>
<JohnDoeView/>
</LinearLayout>
<TextView/>
<LinearLayout> <-- needs to be a another dynamic list
<JohnDoeView/>
<JohnDoeView/>
<JohnDoeView/>
</LinearLayout>
</LinearLayout>
这导致下面的图像,我可以一起滚动整个布局。
但是当我尝试用LinearLayout
替换那些RecyclerView
时,我得到两个单独的滚动区域,就像两个固定的框一样滚动独立。
<LinearLayout>
<TextView/>
<RecyclerView/>
<TextView/>
<RecyclerView/>
</LinearLayout>
我如何获得与LinearLayout
相同的效果,但有动态内容?
答案 0 :(得分:3)
我看到两种解决方案。
ScrollView
。RecyclerView
。解决方案1
为此,您需要使RecyclerView
包装其内容。遗憾的是,你不能只放android:layout_height="wrap_content"
,因为RecyclerView
不支持这一点。幸运的是,有自定义解决方案。我一直在使用它,效果很好。
例如,您可以为LinearLayoutManager
分配this个自定义RecyclerView
。只需按照我链接的页面中的说明操作即可。
解决方案2
您可以使用一个RecyclerView
。这可能需要更加艰苦的工作,因为你必须:
TextView
,Switch
或其他任何内容)分配到某个位置。这肯定是可能的,只需看看RecyclerView
上有多个子类型的(很多)示例中的一个。
答案 1 :(得分:0)
LinearLayout
可以处理动态更改。如果您使用android:animateLayoutChanges
属性,它甚至可以为它们设置动画。当项目数量很大时(比屏幕可以显示的数量多得多),ListView
或Recycler
很有趣,以避免产生大量不可见的视图。
如果您真的想使用RecyclerView
,则只能使用一个TextView
,例如一个用于JohnDoeView
,一个用于PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "INFO");
wl.acquire();
KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock kl = km.newKeyguardLock("name");
kl.disableKeyguard();
答案 2 :(得分:0)
尝试使用此布局结构
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
答案 3 :(得分:0)
您不需要嵌套RecyclerView
或ListView
或任何其他滚动视图。您只需要外部视图为RecyclerView
。内部列表可以通过非常简单的ListLayout
类进行管理,每个子列表都有一个适配器。
public class ListLayout extends LinearLayout {
private Adapter mAdapter;
private Observer mObserver = new Observer();
public ListLayout(Context context) {
super(context);
}
public ListLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public Adapter getAdapter()
{
return mAdapter;
}
public void setAdapter(Adapter adapter) {
if (mAdapter != null)
mAdapter.unregisterDataSetObserver(mObserver);
mAdapter = adapter;
adapter.registerDataSetObserver(mObserver);
mObserver.onChanged();
}
private class Observer extends DataSetObserver {
@Override
public void onChanged() {
final List<View> oldViews = new ArrayList<View>(getChildCount());
for (int i = 0; i < getChildCount(); i++)
oldViews.add(getChildAt(i));
final Iterator<View> iter = oldViews.iterator();
removeAllViews();
for (int i = 0; i < mAdapter.getCount(); i++) {
View convertView = iter.hasNext() ? iter.next() : null;
View newView = mAdapter.getView(i, convertView, ListLayout.this);
addView(newView);
}
super.onChanged();
}
@Override
public void onInvalidated() {
removeAllViews();
super.onInvalidated();
}
}
}