gpt4 book ai didi

android - 将 DrawerLayout 与 fragment 一起使用时 ListView 重影

转载 作者:太空宇宙 更新时间:2023-11-03 12:57:43 26 4
gpt4 key购买 nike

在我将其切换为使用 DrawerLayout 内的 fragment 之前,我的布局工作正常。之后,主视图中的 ListView 在滚动时会重影列表的副本。

ListView 内容滚动,但第一页的副本保留在屏幕上。我一直在记录调试消息,但没有创建 ListView 的第二个副本,也没有从适配器发送数据的第二个副本。

enter image description here

Activity 的布局使用 DrawerLayout 和 fragments,然后切换到 fragments 它工作正常。

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="400dp"
android:layout_height="800dp">

<!-- The main content view -->
<fragment android:name="com.nosweatbudgets.receipts.ReceiptsFragment"
android:id="@+id/receipts_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

<!-- The navigation drawer -->
<fragment android:name="com.nosweatbudgets.navigate.NavigateFragment"
android:id="@+id/navigate_fragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
/>

</android.support.v4.widget.DrawerLayout>

每个 fragment 类都非常简单。

ReceiptsFragment 的 onCreateView 看起来像这样。

    View view = inflater.inflate(R.layout.receipts, container, false);

_adapter = new ReceiptsAdapter(inflater);
ListView list = (ListView) view.findViewById(R.id.receipt_list);
list.setAdapter(_adapter);
_adapter.Refresh();

return view;

NavigateFragment 的onCreateView 基本相同,只是adapter 不同而已。 ReceiptsFragment 是重影,而 NavigateFragment 不是重影。然而,他们基本上可以采用相同的方法。

    View view = inflater.inflate(R.layout.navigate, container, false);

_navigate = new NavigateAdapter(inflater);
// setup the list view for the side
ListView list = (ListView) view.findViewById(R.id.left_drawer);
list.setAdapter(_navigate);
_navigate.Refresh();

return view;

对于上述 fragment 类,我使用以下布局。

receipts.xml 看起来像这样。

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/receipt_list"/>
</RelativeLayout>

navigate.xml 看起来像这样。

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<ListView
android:id="@+id/left_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:background="#EEEEEE"/>
</RelativeLayout>

拉出导航 ListView 工作正常,但主要收据 ListView 存在重影问题。

我完全不知道是什么原因造成的。

编辑:

下面是如何在 ReceiptsAdapter 中创建 View 。

public View getView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if (view == null)
{
view = _inflater.inflate(R.layout.receipt, null);
}

TextView txt_vendor = (TextView) view.findViewById(R.id.receipt_vendor);
TextView txt_category = (TextView) view.findViewById(R.id.receipt_category);
TextView category_btn = (TextView) view.findViewById(R.id.category_btn);

Model receipt = _receipts.get(position);

int vendor_id = receipt.getAsInteger("smart_vendor_id");
int category_id = receipt.getAsInteger("smart_category_id");


if (_vendors.indexOfKey(vendor_id) >= 0)
{
txt_vendor.setText(_vendors.get(vendor_id));
}
else
{
txt_vendor.setText("Select Vendor");
}

if (_categories.indexOfKey(category_id) >= 0)
{
String cat = _categories.get(category_id);
txt_category.setText(cat);
category_btn.setText(Category.ShortTitle(cat));
category_btn.setBackgroundColor(Category.Color(cat));
//txt_category.setBackgroundColor(c);
}
else
{
txt_category.setText("Select Category");
category_btn.setText("N/A");
}

((TextView) view.findViewById(R.id.receipt_amount)).setText("$" + receipt.getAsString("amount"));
((TextView) view.findViewById(R.id.receipt_payment)).setText(receipt.getAsString("payment"));
((TextView) view.findViewById(R.id.receipt_date)).setText(receipt.getAsString("receipt_date"));

return view;
}

编辑:

这就是布局的 Activity 如何通过 onCreate 方法附加 fragment 。

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

// the layout uses fixed width/size, because the layout editor won't render match_parent.
// so I replace the layout parameters here with match_parent.
DrawerLayout layout = (DrawerLayout) getLayoutInflater().inflate(R.layout.main, null);
DrawerLayout.LayoutParams param = new DrawerLayout.LayoutParams(ViewGroup.LayoutParams
.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layout.setLayoutParams(param);
setContentView(layout);

// configure this activity
StyleActionBar();

// Add the fragments
getSupportFragmentManager().beginTransaction()
.add(R.id.navigate_fragment, new NavigateFragment())
.add(R.id.receipts_fragment, new ReceiptsFragment())
.commit();
}

最佳答案

我错误地遵循了 fragment 教程,在布局 XML 中创建了静态 fragment ,并在运行时为同一类创建了动态 fragment 。

主布局使用了 <fragment>标签创建一个在运行时通过 android:name 自动附加的 fragment 属性(property)。

这是我的 layout.xml 中的内容

<fragment android:name="com.nosweatbudgets.receipts.ReceiptsFragment"
android:id="@+id/receipts_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

这足以创建 fragment ,但我错误地在我的 Activity 中添加了 fragment 教程中的代码,如下所示。

    getSupportFragmentManager().beginTransaction()
.add(R.id.navigate_fragment, new NavigateFragment())
.add(R.id.receipts_fragment, new ReceiptsFragment())
.commit();

这在运行时向 Activity 添加了两个额外的 fragment View 。这导致同一位置有两个 ListView 。

看似重影的神器实际上是同一类别的两个 fragment 叠在一起。删除onCreate中的动态创建解决了我的问题。

关于android - 将 DrawerLayout 与 fragment 一起使用时 ListView 重影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125592/

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