Android:make Recyclerview的行为与LinearLayout类似

时间:2015-09-02 11:45:32

标签: android android-layout android-linearlayout android-recyclerview

我有一个布局:

<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相同的效果,但有动态内容?

How I want the layout to look

4 个答案:

答案 0 :(得分:3)

我看到两种解决方案。

  1. 将整个布局插入ScrollView
  2. 使用一个RecyclerView
  3. 解决方案1 ​​

    为此,您需要使RecyclerView包装其内容。遗憾的是,你不能只放android:layout_height="wrap_content",因为RecyclerView不支持这一点。幸运的是,有自定义解决方案。我一直在使用它,效果很好。

    例如,您可以为LinearLayoutManager分配this个自定义RecyclerView。只需按照我链接的页面中的说明操作即可。

    解决方案2

    您可以使用一个RecyclerView。这可能需要更加艰苦的工作,因为你必须:

    • 将您的适配器合并为一个;
    • 将分隔符(TextViewSwitch或其他任何内容)分配到某个位置。

    这肯定是可能的,只需看看RecyclerView上有多个子类型的(很多)示例中的一个。

答案 1 :(得分:0)

LinearLayout可以处理动态更改。如果您使用android:animateLayoutChanges属性,它甚至可以为它们设置动画。当项目数量很大时(比屏幕可以显示的数量多得多),ListViewRecycler很有趣,以避免产生大量不可见的视图。

如果您真的想使用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)

您不需要嵌套RecyclerViewListView或任何其他滚动视图。您只需要外部视图为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();
        }
    }
}

https://gist.github.com/sevar83/0e27c26142f2fba97d57