У меня есть приложение, которое использует элемент управления ViewPager
с FragmentPagerAdapter
.
Я создал TableRow
представление следующим образом:
item_row.axml
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Item"
android:layout_margin="1dp"
android:id="@+id/txtRowItemName"
android:layout_column="0"
android:layout_weight="3"
android:gravity="left" />
<EditText
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_column="1"
android:layout_weight="1"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:inputType="number"
android:gravity="center"
android:imeOptions="actionNext"
android:id="@+id/txtInventory" />
</TableRow>
У меня есть TableLayout
в другом представлении:
inventory.axml
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true"
android:layout_width="fill_parent"
android:isScrollContainer="false"
android:layout_height="0dp"
android:scrollbars="vertical">
<TableLayout
android:layout_marginTop="25dp"
android:layout_marginLeft="25dp"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:id="@+id/tblInventory"
android:gravity="top">
</TableLayout>
</ScrollView>
Вот код бэкэнда для моего фрагмента
public class InventoryFragment : Android.Support.V4.App.Fragment
{
private DataAccess database;
private TableLayout _tblLayout;
private ApiData _data;
public static InventoryFragment NewInstance(ApiData data, DataAccess dbAccess)
{
InventoryFragment newFragment = new InventoryFragment { Arguments = new Bundle(), ApiData = data, database = dbAccess };
return newFragment;
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
view = inflater.Inflate(Resource.Layout.inventory, container, false);
_tblLayout = view.FindViewById<TableLayout>(Resource.Id.tblInventory);
IList<StoreItem> storeItems = database.GetStoreItems();
IList<InventoryCheck> inventoryValues = database.GetLastCheck();
if(storeItems != null)
{
if(storeItems.Any())
{
foreach (StoreItem itm in storeItems)
{
InventoryCheck lastInventory = null;
if (inventoryValues != null)
lastInventory = inventoryValues.SingleOrDefault(i => i.ItemID == itm.ID);
View itemRows = inflater.Inflate(Resource.Layout.item_row, container, false);
_tblLayout.AddView(itemRows);
TextView txtItemName = itemRows.FindViewById<TextView>(Resource.Id.txtRowItemName);
//Setup edit text
EditText txtInventory = itemRows.FindViewById<EditText>(Resource.Id.txtInventory);
txtInventory.Tag = itm.ID;
//Add OnFocus Changed
txtInventory.FocusChange += (sender, e) =>
{
if(!e.HasFocus)
{
int value = 0;
int.TryParse(txtInventory.Text, out value);
//Saves the value to database upon loosing focus
database.SetInventoryItem(itm.ID, value);
}
};
txtItemName.Text = itm.ItemName;
txtInventory.Text = (lastInventory) != null && lastInventory.Inventory > 0 ? lastInventory.Inventory.ToString() : string.Empty;
}
}
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я помещаю текст в поле, он сохраняет его в БД. После отладки я вижу, что данные передаются очень хорошо, но когда представление загружается, все значения перепутаны. Он заменяет все значения на значения в последнем элементе.
Когда я удаляю приложение из «Недавних элементов» и запускаю его снова, значения, которые они заполняют, являются правильными. Что я делаю не так.