gpt4 book ai didi

android - 如何保留 fragment ListView 内容?

转载 作者:行者123 更新时间:2023-11-30 03:48:07 25 4
gpt4 key购买 nike

序言:我正在使用 ActionBarSherlock,Target SDK 是 17 (Android 4.2),Min SDK 是 5 (Android 2.0)

情况:

我的应用程序中有一个 fragment ,它提供某种登录。它允许用户在设备上拥有多个用户帐户(因为 Android < 4.2 没有系统支持,我们的用户似乎由于设备共享而使用它)。

fragment 布局由一个 ListView 组成,在大横向上还有一个用于添加新帐户的按钮(否则通过可用的溢出菜单)。

ListView 附加到一个名为“AccountAdapter”的 BaseAdapter-Derivate,它从数据库中获取帐户并通过 layoutinflater 为每个帐户创建相应的 subview 。有 3 种可能性:用户提供登录名和密码/用户仅提供登录名/用户未提供任何内容。因此,对于这些情况,有 3 种不同的布局,其中通过 EditText-Elements 请求丢失的数据,并通过 TextView 显示存储的数据。此外,具有缺失数据的布局提供了一个用于存储缺失数据的复选框和一个提交按钮。如果提供了所有数据,则缺少提交按钮的 onclicklistener 将直接附加到帐户 Root View 。onclicklistener将输入的数据消息给网络代码类,修改适配器模式;之后,适配器仅显示所选条目,但带有“进度” View ,以将当前操作可视化给用户(“用户 XXX 正在登录,请稍候...”)。

这已经很好用了。

问题:

在方向改变时,所有输入的数据都会丢失。输入的登录数据、密码以及有关是否应存储登录数据的信息。

布局:

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

<FrameLayout
android:id="@id/main_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

<!-- layout-large-land/main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<FrameLayout
android:id="@id/main_fragment_sidebar"
android:layout_width="@dimen/main_sidebar_width"
android:layout_height="match_parent" />

<FrameLayout
android:id="@id/main_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

<!-- layout/fragment_login.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/fragment_login_accountlist"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>

</RelativeLayout>

<!-- layout-large-land/fragment_login.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" >

<Button
android:id="@id/fragment_login_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="@string/string_fragment_login" />

<ListView
android:id="@id/fragment_login_accountlist"
android:layout_width="@dimen/fragment_login_accountlist_width"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" >

</ListView>

</RelativeLayout>

<!-- layout/view_login_account_new.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" >

<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />

<EditText
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
android:hint="@string/string_view_login_account_username_hint"
android:inputType="text" >

<requestFocus />
</EditText>

<EditText
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:hint="@string/string_view_login_account_password_hint"
android:inputType="textPassword" />

<CheckBox
android:id="@id/view_login_account_storecredentials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_password"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:text="@string/string_view_login_account_storecredentials_text" />

<Button
android:id="@id/view_login_account_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_storecredentials"
android:text="@string/string_view_login_account_submit_text" />

</RelativeLayout>

<!-- layout/view_login_account_progress.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" >

<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />

<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
>
</TextView>

<TextView
android:id="@id/view_login_account_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:text="@string/string_view_login_account_progress_text" />

</RelativeLayout>

<!-- layout/view_login_account_stored_password.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" >

<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />

<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
>
</TextView>

<TextView
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:text="@string/string_view_login_account_password_text"
/>

</RelativeLayout>

<!-- layout/view_login_account_stored_username.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" >

<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />

<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
android:hint="@string/string_view_login_account_username_hint" >

<requestFocus />
</TextView>

<EditText
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:hint="@string/string_view_login_account_password_hint"
android:inputType="textPassword" />

<CheckBox
android:id="@id/view_login_account_storecredentials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_password"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:text="@string/string_view_login_account_storecredentials_text" />

<Button
android:id="@id/view_login_account_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_storecredentials"
android:text="@string/string_view_login_account_submit_text" />

</RelativeLayout>

代码:

代码都没有实现 onSaveInstanceState 和 onConfigurationChange。(整个报价太长恕我直言,> 1.000 行代码)

public class MessengerActivity extends SherlockFragmentActivity {

// -------------------------------------------------------------------------

FrameLayout fragmentSidebar = null;
FrameLayout fragmentContent = null;

Content content = null;

// -------------------------------------------------------------------------

boolean hasSidebar = false;

// -------------------------------------------------------------------------

public void onCreate(Bundle savedInstanceState) {

// ---------------------------------------------------------------------

super.onCreate(savedInstanceState);

// ---------------------------------------------------------------------

content = Content.getInstance(this);

// ---------------------------------------------------------------------

setContentView(R.layout.main);

// ---------------------------------------------------------------------

captureFragmentViews();

// ---------------------------------------------------------------------

// ---------------------------------------------------------------------

if (savedInstanceState == null) {

// -----------------------------------------------------------------

gotoLogin();

// -----------------------------------------------------------------

}
else {

// -----------------------------------------------------------------

// -----------------------------------------------------------------

}


// ---------------------------------------------------------------------

}

// -------------------------------------------------------------------------
// Disabled through android manifest at the moment

@Override
public void onConfigurationChanged(Configuration newConfig) {

// ---------------------------------------------------------------------

super.onConfigurationChanged(newConfig);

// ---------------------------------------------------------------------

Log.d(getClass().getSimpleName(), "onConfigurationChanged");

// ---------------------------------------------------------------------

}

// -------------------------------------------------------------------------

public void captureFragmentViews() {

// ---------------------------------------------------------------------

fragmentSidebar = (FrameLayout) findViewById(R.id.main_fragment_sidebar);
fragmentContent = (FrameLayout) findViewById(R.id.main_fragment_content);

// ---------------------------------------------------------------------

if ((fragmentSidebar != null) && (fragmentContent != null)) {

hasSidebar = true;

}
else {

hasSidebar = false;

}

// ---------------------------------------------------------------------

}

// -------------------------------------------------------------------------

public void gotoLogin() {

// ---------------------------------------------------------------------

Fragment fragment = SherlockFragment.instantiate(this,
LoginFragment.class.getName());

// ---------------------------------------------------------------------

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

if (hasSidebar) {

ft.add(R.id.main_fragment_content, fragment);
fragmentSidebar.setVisibility(View.GONE);

}
else {

ft.add(R.id.main_fragment_content, fragment);

}

// ---------------------------------------------------------------------

ft.commit();
getSupportFragmentManager().executePendingTransactions();

// ---------------------------------------------------------------------

}

// -------------------------------------------------------------------------

public void gotoSignup() {
// TODO Auto-generated method stub

}

// -------------------------------------------------------------------------

public void gotoContactList(int filterId) {
// TODO Auto-generated method stub

}

// -------------------------------------------------------------------------

public void gotoConversation(int userId) {
// TODO Auto-generated method stub

}

// -------------------------------------------------------------------------

public void gotoOnlineStatusList(int categoryId) {
// TODO Auto-generated method stub

}

// -------------------------------------------------------------------------

public void gotoSettings(int categoryId) {
// TODO Auto-generated method stub

}

// -------------------------------------------------------------------------

}

我检查是否在主 Activity 中设置了 savedInstanceState,因此我的 Activity 在 fragment 重建方面已经“准备好”。

Fragment 在创建适配器并将其附加到 ListView 之前检查适配器是否已经存在。但是:据我所知,即使“重新创建”的 fragment 使用相同的适配器,“默认情况下”所有 getViews() 都会被调用,因此会创建一个具有“重置”内容的新 View 实例。

AccountAdapter 从数据库中获取专用的“Account”——具有用户 ID、用户名、密码的对象。此外,可以扩展“帐户”以保存其他数据,例如缓存 View 。

我的想法是像这样实现一个 getView:

    @Override
public View getView(final int position, View convertView, ViewGroup parent) {

// ---------------------------------------------------------------------

final Account account = (Account) getItem(position);
View view = null;

// ---------------------------------------------------------------------

if (account == null) {

return view;

}

// ---------------------------------------------------------------------

if (account.view != null) {

return account.view;

}

// ---------------------------------------------------------------------
[...]
}

但后来我注意到,AccountAdapter 没有在重新创建后存活下来,Android 重新实例化了 LoginFragment 类。

我需要什么:

  • 如何从 ListView 内容公式中恢复数据/如何保留 AccountAdapter 及其相关 View
  • 有关如何优化和改进我的架构设计的提示

最佳答案

如果每次调用 ActivityonCreate() 方法时添加一个 Fragment,您的代码并不清楚。

您应该仅在首次创建 Activity 时添加一个 Fragment 或第一个 Fragment

if(savedInstanceState==null){
addFragment();
}

如果这不是 null,您的 Activity 将被重新创建,并且它还会重新添加您之前的 Fragments。 Evan 如果您在 backstack 中有更多的 Fragments,它们将全部放回您的 Activity 中。

要将数据保留在 fragment 中,您应该在 Fragments onCreate() 方法上使用 setRetainInstance(true);,或者使用 onSaveInstanceState(Bundle bundle) 来保存特定数据。

关于android - 如何保留 fragment ListView 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14623012/

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