2016-10-31 4 views
0

Каждый элемент в моем представлении списка состоит из EditTexts, который пользователь может редактировать. Цель состоит в том, что когда пользователь фокусируется вне конкретного edittext, значение, которое он вставил, будет сохранено в базе данных Realm.Редактируемые ListView items with Realm

Добавление пустых элементов в список отлично работает, но фактическая экономия данных - это то, с чем я борюсь.

Что я сделал:
В адаптере, я добавил onFocusChangeListener к каждому из edittexts. Однако я не могу сохранить данные для этой конкретной строки или объекта.
У меня есть позиция предмета от адаптера, но я не могу получить доступ к 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

У вас проблемы с этим, потому что вы используете 'ListView' вместо' RecyclerView'. – EpicPandaForce

+0

@EpicPandaForce Как реджиклер просматривает мои проблемы? – batman191

+0

Самая большая проблема с ListView всегда занималась фокусировкой на фокусируемых элементах внутри элемента списка. – EpicPandaForce

ответ

1

Просто введите запрос по идентификатору и сделайте конечную переменную, доступ к которой вы можете получить в анонимном классе.

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

Это работает, и это здорово. Тем не менее, это мешает мне иметь всех слушателей в одной функции. С этим решением я должен повторить себя примерно с одним и тем же кодом для каждого из полей. То есть для каждого из полей мне нужно добавить onFocusChangeListener и обновить базу данных ... – batman191