EditText в значениях TableRow путаются - PullRequest
0 голосов
/ 25 июня 2018

У меня есть приложение, которое использует элемент управления 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;
                }

            }

        }
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я помещаю текст в поле, он сохраняет его в БД. После отладки я вижу, что данные передаются очень хорошо, но когда представление загружается, все значения перепутаны. Он заменяет все значения на значения в последнем элементе.

Когда я удаляю приложение из «Недавних элементов» и запускаю его снова, значения, которые они заполняют, являются правильными. Что я делаю не так.

...