列表视图未在NestedScrollView中使用视图分页器在片段中滚动 [英] List view not scrolling in fragment using view pager inside NestedScrollView
问题描述
我需要创建类似whatsapp的布局,该布局可以滚动操作栏,但不能滚动tabLayout.我使用viewpager加载片段. 在片段中,我添加了listview,但是在Listview上滚动,该操作栏没有滚动到那里. 使用一些关于stackoverflow的教程,我为此目的需要使用nestedScrollView,它对我有用. 但它停止滚动listview. 我为此使用了这段代码.
Hi there i needed to create layout like whatsapp, which scrolls the actionbar but not tabLayout. I used viewpager for loads fragment in it. In fragment i added listview but on Listview scroll that action bar not scrolling there. Using some tutorials on stackoverflow i got that for this purpose needed to use nestedScrollView and it works for me. But it stops scrolling listview. I used this code for that.
<?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>
我使用LinearLayout monHeight = 1000dp,因为如果我在nestedScrollView中使用android:fillViewPort ="true"并从LinearLayout中删除minHeight,则列表视图会显示但不会滚动. 现在,它会滚动,但是直到1000dp为止,其他项都不会显示.
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.
推荐答案
Okey首先,您在NestedScrollView
中扭曲了ViewPager
,这不是必需的.
Okey first of all You warped ViewPager
inside NestedScrollView
, this is not necessary.
所以改变
<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
.
Now Your are taking ListView
, which is not working good with AppBarLayout
, so I suggest you use RecyclerView
instead.
注意:如果您仍然想使用ListView
,则可以使用NonScrollListview
将其包装在NestedScrollView
下.
Note: if you still want to use ListView
you can use NonScrollListview
wraping it under 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>
我希望这会对您有所帮助. 祝您编码愉快.
I hope this will help you out. Happy coding..
这篇关于列表视图未在NestedScrollView中使用视图分页器在片段中滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!