在 android studio中实现上下滑动的新闻列表,但是新闻列表的导航栏在向上滑动至页面顶端时会自动固定在页面的顶端,但当页面向下滑动时,当新闻的内容至顶端时导航栏会随着新闻内容而向下滑动。请给出实现这些功能的详细代码
时间: 2024-03-09 10:44:53 浏览: 65
实现上述功能需要用到 `RecyclerView` 来展示新闻列表,而导航栏则可以通过 `CoordinatorLayout` 和 `AppBarLayout` 实现固定和滑动。下面是详细的代码实现:
1. 在布局文件中定义 `CoordinatorLayout` 和 `AppBarLayout`,并在 `AppBarLayout` 中添加导航栏和一个 `Toolbar`,如下所示:
```xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
```
2. 在 Activity 或 Fragment 中初始化 `RecyclerView` 和 `TabLayout`,并设置适配器,如下所示:
```java
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new NewsAdapter());
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
```
3. 在 `onCreate` 方法中设置 `AppBarLayout` 的滑动行为,并添加一个 `OffsetChangedListener`,在滑动时判断导航栏是否固定,如下所示:
```java
AppBarLayout appBarLayout = findViewById(R.id.app_bar);
appBarLayout.setExpanded(true);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
boolean isAppBarLayoutExpanded = true;
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (Math.abs(verticalOffset) > 200) {
isAppBarLayoutExpanded = false;
} else {
isAppBarLayoutExpanded = true;
}
// 根据是否固定来设置导航栏的滑动
setScrollBehavior(isAppBarLayoutExpanded);
}
});
private void setScrollBehavior(boolean isAppBarLayoutExpanded) {
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (isAppBarLayoutExpanded) {
// 固定导航栏
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return false;
}
});
} else {
// 滑动导航栏
behavior.setDragCallback(null);
}
}
```
4. 在 `NewsAdapter` 中实现新闻列表的展示和滑动,如下所示:
```java
class NewsAdapter extends RecyclerView.Adapter<NewsViewHolder> {
@NonNull
@Override
public NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_news, parent, false);
return new NewsViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull NewsViewHolder holder, int position) {
// 设置新闻内容
}
@Override
public int getItemCount() {
return 10;
}
}
class NewsViewHolder extends RecyclerView.ViewHolder {
public NewsViewHolder(@NonNull View itemView) {
super(itemView);
// 在这里设置新闻内容的滑动
itemView.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 禁止 RecyclerView 拦截事件
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// 允许 RecyclerView 拦截事件
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
// 判断是否滑动到顶部或底部
if (!v.canScrollVertically(-1) && event.getY() > mLastY) {
// 滑动到顶部并向下滑动
v.getParent().requestDisallowInterceptTouchEvent(false);
} else if (!v.canScrollVertically(1) && event.getY() < mLastY) {
// 滑动到底部并向上滑动
v.getParent().requestDisallowInterceptTouchEvent(false);
} else {
// 允许 RecyclerView 拦截事件
v.getParent().requestDisallowInterceptTouchEvent(true);
}
mLastY = event.getY();
break;
}
return false;
});
}
}
```
通过以上代码的实现,你可以在 Android Studio 中实现上下滑动的新闻列表,并且可以自动固定导航栏在页面的顶端,也可以让导航栏随着新闻内容一起向下滑动。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)