列表视图不使用 NestedScrollView 内的视图寻呼机在片段中滚动

List view not scrolling in fragment using view pager inside NestedScrollView

你好,我需要创建类似 whatsapp 的布局,它滚动操作栏而不是 tabLayout。我使用 viewpager 在其中加载片段。 在片段中我添加了 listview 但在 Listview 上滚动该操作栏不滚动到那里。 使用关于 Whosebug 的一些教程,我得到了为此目的需要使用 nestedScrollView 并且它对我有用。 但它停止滚动列表视图。 我为此使用了这段代码。

activity_my.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"></android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_gravity="bottom"
    app:layout_anchor="@+id/appbar"
    app:layout_anchorGravity="bottom"
    app:layout_collapseMode="none">

    <ImageView
        android:id="@+id/tabBg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/primary"
        android:scaleType="fitXY" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_gravity="bottom"
        android:background="#00000000"
        app:layout_anchor="@+id/appbar"
        app:layout_anchorGravity="bottom"
        app:layout_collapseMode="none"
        app:tabGravity="fill"
        app:tabIndicatorColor="#fff"
        app:tabIndicatorHeight="2dp"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="#fff"
        app:tabTextColor="#fff" />

</FrameLayout>
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="1000dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

<!--<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />-->
</android.support.design.widget.CoordinatorLayout>

MyActivity.java

public class MyActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
ArrayList<Fragment> fragmentArrayList;
TabAdapter tabAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    /*Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);*/

    viewPager = (ViewPager) findViewById(R.id.pager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    TabAdapter adapter = new TabAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(new OneFragment(), "TWO");
    adapter.addFragment(new OneFragment(), "THREE");
    viewPager.setAdapter(adapter);
   }

 }

FragmentOne.java

public class OneFragment extends Fragment {
ListView listTest;
ArrayList<String> itemList;
ArrayAdapter<String> adapter;

public OneFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_one, container, false);
    listTest = (ListView) view.findViewById(R.id.listTest);
    itemList = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        itemList.add("Item : " + i);
    }
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, itemList);
    listTest.setAdapter(adapter);
    return view;
   }
}

fragment_one.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/listTest"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</RelativeLayout>

I used LinearLayout monHeight = 1000dp because if i use android:fillViewPort="true" in nestedScrollView and remove minHeight from LinearLayout then listview shows but not scroll. Now it scrolls but till 1000dp then the other items are not shown.

你可以使用 Observable scrollview Refer the link

好吧,首先你在 NestedScrollView 中扭曲了 ViewPager,这是没有必要的。

所以改变,

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="1000dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

到,

<android.support.v4.view.ViewPager
     android:id="@+id/pager"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_weight="1"
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

现在你正在服用 ListView,这不适用于 AppBarLayout,所以我建议你改用 RecyclerView

注意:如果你还想用ListView你可以用NonScrollListview把它包在NestedScrollView.

下面

NonScrollListView

public class NonScrollListView extends ListView {

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

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

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

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
         super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
         ViewGroup.LayoutParams params = getLayoutParams();
         params.height = getMeasuredHeight();
    }
}

只需更改您的 fragment_one 即可。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <packagename.NonScrollListView
        android:id="@+id/listTest"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></packagename.NonScrollListView>
</android.support.v4.widget.NestedScrollView>

希望对您有所帮助。 编码愉快..