gpt4 book ai didi

android - 如何在 fragment 中保存recyclerview的滚动位置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:18 26 4
gpt4 key购买 nike

我从这里得到了很多答案..但没有一个能解决我的问题..这就是我问的原因。

我想在 fragment 中保存滚动位置。在他们建议关注的许多文章中

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}

但这两种方法在fragment中是不可用的。

我的代码:

private int mPositionIng = RecyclerView.NO_POSITION;

private String KEY_POSITION_ING = "KeyPositionIng";

在 OnCreateView() 中

if (savedInstanceState != null) {

if (savedInstanceState.containsKey(KEY_POSITION_ING)) {
mPositionIng = savedInstanceState.getInt(KEY_POSITION_ING);
}
}

覆盖 fragment 中的方法 它们与上面的方法不同。我不知道我哪里做错了。

@Override
public void onSaveInstanceState(Bundle outState) {

int scrollPositionIng = mRecyclerViewIngredients.computeVerticalScrollOffset();

mPositionIng = scrollPositionIng;

outState.putInt(KEY_POSITION_ING, mPositionIng);
super.onSaveInstanceState(outState);
}

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {

if (mPositionIng != RecyclerView.NO_POSITION) {

mRecyclerViewIngredients.getLayoutManager().scrollToPosition(mPositionIng);
}


super.onViewStateRestored(savedInstanceState);
}

我只需要在方向改变时保存滚动位置..请帮忙。任何建议都将得到充分帮助。谢谢……

最佳答案

更新

我在下面写的一切都是正确的,但它对你不起作用的原因是我没有意识到你的 Activity 的布局是如何构建的。这是您的 Activity 的布局(稍微清理了一下):

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tapan.recipemaster.activity.RecipeDetailActivity">

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<FrameLayout
android:id="@+id/fl_fragment_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/padding_10dp"/>

</RelativeLayout>

</ScrollView>

</android.support.constraint.ConstraintLayout>

同时,这是您的 Fragment 的布局(同样,稍微清理了一下):

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tapan.recipemaster.fragment.RecipeDetailFragment">

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_10dp"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:orientation="vertical">

<TextView
android:id="@+id/tv_ingredient"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#FFF"
android:textSize="@dimen/text_23sp"
android:text="Ingredients"/>

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_ingredients"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_8dp"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/tv_step"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_8dp"
android:textColor="@color/colorPrimaryDark"
android:textSize="@dimen/text_23sp"
android:text="Steps"/>

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_steps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_8dp"/>

</LinearLayout>

</LinearLayout>

</ScrollView>

</FrameLayout>

两个 RecyclerView 都有 android:layout_height="wrap_content",这意味着它们不会滚动。相反,Activity 中的 ScrollView 是提供滚动行为的 View ,因此必须保存其滚动位置的 View 。 p>

您可以通过给这个 ScrollView 一个 id 让系统为您做这件事。任何你想要的 id,只要它是唯一的。您根本不必编写任何 Java。

<ScrollView
android:id="@+id/thisfixestheproblem"
android:layout_width="match_parent"
android:layout_height="match_parent">

确保您修改的是 Activity 布局中的 ScrollView,而不是 fragment 布局中的那个。

原创

您发布的代码都不是保存您的 RecyclerView 方向更改时的滚动位置所必需的。只要 RecyclerView 在您的布局中具有唯一 ID,它就会自动为您保存滚动位置。

这是一个非常小的示例应用程序,它显示自动保存滚动位置,即使是动态添加的 Fragment。如您所见,我为自己保存的唯一实例状态是启动 fragment 的按钮是否应该可见。

MainActivity.java

public class MainActivity extends AppCompatActivity {

private Button button;

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("buttonVisible", button.getVisibility() == View.VISIBLE);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content, new MyFragment())
.commit();

button.setVisibility(View.GONE);
}
});

if (savedInstanceState != null) {
boolean buttonVisible = savedInstanceState.getBoolean("buttonVisible");
button.setVisibility(buttonVisible ? View.VISIBLE : View.GONE);
}
}
}

MyFragment.java

public class MyFragment extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.myfragment, container, false);

RecyclerView recycler = (RecyclerView) root.findViewById(R.id.recycler);
recycler.setAdapter(new MyAdapter());

return root;
}

private static class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.itemview, parent, false);
return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Drawable d = new ColorDrawable(Color.argb(0xff, 0, 0, position));
ViewCompat.setBackground(holder.image, d);
holder.text.setText("" + position);
}

@Override
public int getItemCount() {
return 256;
}
}

private static class MyViewHolder extends RecyclerView.ViewHolder {

final View image;
final TextView text;

MyViewHolder(View itemView) {
super(itemView);

this.image = itemView.findViewById(R.id.image);
this.text = (TextView) itemView.findViewById(R.id.text);
}
}
}

activity_main.xml

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

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="create fragment"/>

</FrameLayout>

myfragment.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
tools:listitem="@layout/itemview"/>

itemview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">

<View
android:id="@+id/image"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="12dp"
tools:background="#333"/>

<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="text"/>

</LinearLayout>

关于android - 如何在 fragment 中保存recyclerview的滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com