2015-12-30 2 views
0

У меня есть ListView, у которого есть скрытый button, которые становятся видимыми при длительном нажатии на строку. Если кто-то нажимает на эту кнопку, строка удаляется.Текст списка просмотра списка Android при удалении строки

Мои строки состоят из транзакций, и в том же Activity у меня есть TextView, отображающий сумму.

Когда я добавляю транзакцию, мой текст изменяется и обновляется бюджет. Моя проблема заключается в его обновлении, когда пользователь нажимает кнопку и удаляет строку.

вот мой адаптер класса

public class HomePageListAdapter extends ArrayAdapter<TRANSAZIONE> { 

    ArrayList<TRANSAZIONE> transazioni; 
    public HomePageListAdapter(Context context, int textViewResourceId, 
           ArrayList<TRANSAZIONE> objects) { 
     super(context, textViewResourceId, objects); 
     transazioni = objects; 
    } 

    TRANSAZIONE transazione; 
    NumberFormat formatter = new DecimalFormat("#0.00"); 

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.adapter_home_page_list, null); 

     TextView tvDesc = (TextView) view.findViewById(R.id.tvDescription); 
     TextView tvAmou = (TextView) view.findViewById(R.id.tvAmount); 
     final Button btnElimina = (Button) view.findViewById(R.id.btnElimina); 

     transazione = transazioni.get(position); 

     String dText = transazione.getDescription(); 
     String aText = ""; 
     if(transazione.getAmount() != null) { 
      aText = formatter.format(transazione.getAmount()) + " €"; 
      if (transazione.getAmount() > 0) { 
       tvAmou.setTextColor(Color.GREEN); 
      } else { 
       tvAmou.setTextColor(Color.RED); 
      } 
     } 
     tvDesc.setText(dText); 
     tvAmou.setText(aText); 

     view.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       btnElimina.setVisibility(View.VISIBLE); 
       return false; 
      } 
     }); 

     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (btnElimina.getVisibility() == View.VISIBLE) { 
        btnElimina.setVisibility(View.GONE); 
       } 
      } 
     }); 

     btnElimina.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        new TRANSAZIONE().Delete(TRANSAZIONE.class, getContext(), "where id = '" + transazioni.get(position).getId() + "'"); 
        Toast.makeText(getContext(), "Transazione eliminata.", Toast.LENGTH_SHORT).show(); 
        transazioni.remove(position); 
        notifyDataSetChanged(); 

       } catch (Exception ex) { 
        Toast.makeText(getContext(), "Errore non gestito.", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     return view; 
    } 
} 

Он работает должным образом, и у меня нет никаких проблем с обновлением моего макета.

** И это метод, который обновляет текст TextView и вызывает адаптер. Это в деятельности **

public void LoadTotal() throws Exception { 

    @SuppressWarnings("unchecked") 
    ArrayList<TRANSAZIONE> transazioni = (ArrayList<TRANSAZIONE>) new TRANSAZIONE().SelectAll(TRANSAZIONE.class, getContext(), ""); 

    Double totale = Settings.getLimitAmount(); 

    //prendo solo quelle del mese corrente 
    if (transazioni.size() > 0) { 
     int numeroAggiornamento = Settings.getResettingDay(); 

     Calendar today = Calendar.getInstance(); 

     Calendar transactionDate = Calendar.getInstance(); 

     Calendar lastChangeDate = Calendar.getInstance(); 
     lastChangeDate.set(Calendar.DAY_OF_MONTH, numeroAggiornamento); 
     if (today.get(Calendar.DAY_OF_MONTH) < numeroAggiornamento) { 
      lastChangeDate.add(Calendar.MONTH, -1); 
     } 

     for (TRANSAZIONE t : transazioni) { 
      transactionDate.setTime(t.getDate()); 

      if (transactionDate.compareTo(lastChangeDate) == -1) { 
       transazioni.remove(t); 
      } else { 
       totale += t.getAmount(); 
      } 
     } 
    } 
    if (transazioni.size() == 0) { 
     transazioni.add(new TRANSAZIONE("Nessuna transazione per il mese in corso.", null, null)); 
    } 
    HomePageListAdapter adapter = new HomePageListAdapter(getContext(), R.layout.adapter_home_page_list, transazioni); 
    lvTransactions.setAdapter(adapter); 
    tvBudget.setText(formatter.format(totale)); 
} 

Моя проблема заключается в следующем:

  • При удалении строки, он исчезает из списка, но я не могу перехватить это в моей деятельности.
  • Мне нужно как-то позвонить по методу LoadTotal(), когда моя строка удалена.

Любая помощь будет оценена по достоинству.

Спасибо всем и извините за мой неподдельный английский.

ответ

1

В классе адаптера

public class HomePageListAdapter extends ArrayAdapter<TRANSAZIONE> { 
Context context; 
    ArrayList<TRANSAZIONE> transazioni; 
    public HomePageListAdapter(Context context, int textViewResourceId, 
           ArrayList<TRANSAZIONE> objects) { 
     super(context, textViewResourceId, objects); 
     transazioni = objects; 
this.context=context; 
    } 

    TRANSAZIONE transazione; 
    NumberFormat formatter = new DecimalFormat("#0.00"); 

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.adapter_home_page_list, null); 

     TextView tvDesc = (TextView) view.findViewById(R.id.tvDescription); 
     TextView tvAmou = (TextView) view.findViewById(R.id.tvAmount); 
     final Button btnElimina = (Button) view.findViewById(R.id.btnElimina); 

     transazione = transazioni.get(position); 

     String dText = transazione.getDescription(); 
     String aText = ""; 
     if(transazione.getAmount() != null) { 
      aText = formatter.format(transazione.getAmount()) + " €"; 
      if (transazione.getAmount() > 0) { 
       tvAmou.setTextColor(Color.GREEN); 
      } else { 
       tvAmou.setTextColor(Color.RED); 
      } 
     } 
     tvDesc.setText(dText); 
     tvAmou.setText(aText); 

     view.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       btnElimina.setVisibility(View.VISIBLE); 
       return false; 
      } 
     }); 

     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (btnElimina.getVisibility() == View.VISIBLE) { 
        btnElimina.setVisibility(View.GONE); 
       } 
      } 
     }); 

     btnElimina.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        new TRANSAZIONE().Delete(TRANSAZIONE.class, getContext(), "where id = '" + transazioni.get(position).getId() + "'"); 
        Toast.makeText(getContext(), "Transazione eliminata.", Toast.LENGTH_SHORT).show(); 
        transazioni.remove(position); 
        notifyDataSetChanged(); 

       } catch (Exception ex) { 
        Toast.makeText(getContext(), "Errore non gestito.", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     return view; 
    } 
} 

Вы можете вызвать метод вашей деятельности как

((YourActivityName)context).LoadTotal(); 
+1

Спасибо! поэтому мой метод не сработал, я искал новый объект YourActivityName .. U спас мой день, спасибо! –

2

Чистейшая способ сделать это с помощью DataSetObserver.

Внутри вашей деятельности вы имеете этот объект:

private DataSetObserver adapterObserver = new DataSetObserver() { 
    @Override 
    public void onChanged(){ 
     // here you call your method 
     LoadTotal(); 
    } 
} 

и затем зарегистрировать/unreguster этого наблюдателя при onResume/OnPause

@Override 
public void onResume(){ 
    super.onResume(); 
    LoadTotal(); // update with latest values 
    adapter.registerDataSetObserver(adapterObserver); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    adapter.unregisterDataSetObserver(adapterObserver); 
} 

редактировать: некоторые отладочную информацию для ор.

вот код для notifyDataSetChanged() от BaseAdapter

public void notifyDataSetChanged() { 
    mDataSetObservable.notifyChanged(); 
} 

, а затем внутри DataSetObservable просто пробегаем по списку наблюдателей

for (int i = mObservers.size() - 1; i >= 0; i--) { 
    mObservers.get(i).onChanged(); 
} 

Это означает, что есть очень мало на самом деле пойти не туда. Но важно понять, что происходит.Поэтому мое предложение - поставить точку останова на все вызовы метода: onPause, onResume, onChanged и строку, которую вы вызываете notifyDataSetChanged. И запустите его с помощью отладчика, чтобы вы могли видеть, что называется, когда и узнаете, почему он не работает.

+0

Я попытался исправить этот код, но он не работает, этот datasetobserver никогда не вызывается. Я отредактирую ваш ответ с исправлениями, которые я нашел, но он все еще не работает :( –

+0

- это то же самое, что ListView get уведомляется об изменениях и обновлениях своих статусов. Я отредактировал код, чтобы поместить вызовы на 'super.', что я пропустил. Я набрал все наизусть, и могут быть какие-то опечатки, но я могу гарантировать, что логически это правильно. Вы, случайно, вызываете 'notifyDataSetChanged();' когда действие приостановлено? Тогда вам, вероятно, понадобится дополнительный вызов 'LoadTotal()' во время 'onResume()', чтобы быть уверенным, что значение обновлено – Budius

+0

Я вызываю notifydatasetch, только в классе адаптера. Я попытаюсь заставить его работать, кажется, лучшее решение :) –

Смежные вопросы