2016-10-31 9 views
0

リストビューの各アイテムは、ユーザーが編集できるEditTextsで構成されています。目標は、ユーザーが特定の編集テキストにフォーカスすると、挿入した値がRealmデータベースに保存されることです。レルムを持つ編集可能なリストビューアイテム

リストに空のアイテムを追加すると効果的ですが、データの実際の保存は私が苦労しているものです。私が何をしたか

:アダプターで
は、私がedittextsのそれぞれにonFocusChangeListenerを追加しました。しかし、私はこの特定の行またはオブジェクトのデータを保存することはできません。
アダプターからのアイテムの位置がありますが、位置によってRealmObjectにアクセスすることはできません。

マイコード:

public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.row_exercise, parent, false); 

     viewHolder = new ViewHolder(); 
     viewHolder.etName = (EditText) convertView.findViewById(R.id.etName); 
     viewHolder.etWorkload = (EditText) convertView.findViewById(R.id.etWorkload); 
     viewHolder.etWeight = (EditText) convertView.findViewById(R.id.etWeight); 

     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    // assigning values 
    Exercise e = adapterData.get(position); 
    viewHolder.etName.setText(e.getName()); 
    viewHolder.etWorkload.setText(e.getWorkload()); 
    viewHolder.etWeight.setText(String.valueOf(e.getWeight())); 

    // updating information 
    viewHolder.etName.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       Log.v(TAG, "saving ex. name: " + viewHolder.etName.getText()); 
       realm.executeTransaction(new Realm.Transaction() { 
        @Override 
        public void execute(Realm realm) { 
         // THIS IS THE PROBLEM 
         // realm.where(Exercise.class). 
        } 
       }); 
      } 
     } 
    }); 

    // ... 
    // a listener for every edittext 

感謝。

+0

「RecyclerView」ではなく「ListView」を使用しているため、このような問題が発生しています。 – EpicPandaForce

+0

@EpicPandaForceどのようにRecyclerViewで問題を解決できますか? – batman191

+0

ListViewの最大の問題は、常にリスト項目内のフォーカス可能な項目のフォーカスを処理していたことです。 – EpicPandaForce

答えて

1

IDで照会して、匿名クラス内でアクセスできる最終変数を作成してください。

public class MyAdapter extends RealmBaseAdapter { // RealmRecyclerViewAdapter is better for htis 
    // ... 

    final Exercise e = adapterData.get(position); 
    final long eId = e.getId(); 

    // updating information 
    viewHolder.etName.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       Log.v(TAG, "saving ex. name: " + viewHolder.etName.getText()); 
       realm.executeTransactionAsync(new Realm.Transaction() { 
        @Override 
        public void execute(Realm realm) { 
         Exercise _e = realm.where(Exercise.class) 
              .equalTo(ExerciseFields.ID, eId) 
              .findFirst(); 
         if(_e != null) { 
          // ... 
         } 
        } 
       }); 
      } 
     } 
    }); 
+0

これはうまくいきます。しかし、それは私が1つの機能ですべてのリスナーを持つことを防ぎます。このソリューションでは、それぞれのフィールドでほぼ同じコードで自分自身を繰り返す必要があります。つまり、フィールドごとに、私はonFocusChangeListenerを追加し、データベースを更新する必要があります... – batman191

関連する問題