Android 删除行时列表视图更改文本

Android list view change text when row is deleted

我有一个 ListView,它有一个隐藏的 button,它在用户长按行时变得可见。 如果有人单击此按钮,该行将被删除。

我的行由交易组成,在同一个 Activity 中,我有一个 TextView 显示金额。

当我添加交易时,我的文本发生了变化,预​​算也得到了更新。我的问题是当用户单击按钮并删除一行时更新它。

这是我的适配器class

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 的文本并调用适配器的方法。它在 Activity**

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));
}

我的问题如下:

我们将不胜感激。

谢谢大家,抱歉我的英语不完美。

在你的适配器中class

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;
    }
}

您可以像

一样调用 activity 的方法
((YourActivityName)context).LoadTotal();

最简洁的方法是使用 DataSetObserver.

在你的 activity 中你有这个对象:

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

然后你 register/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);
}

编辑: op 的一些调试信息。

这是来自 BaseAdapter

notifyDataSetChanged() 的代码
public void notifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
}

然后在 DataSetObservable 内部简单地遍历观察者列表

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

这意味着几乎没有什么地方会出错。但了解正在发生的事情很重要。所以我的建议是在所有方法调用上放置一个断点:onPause、onResume、onChanged 和你调用的行 notifyDataSetChanged。并且 运行 它与调试器一起使用,因此您可以看到什么时候调用了什么,并找出它为什么不工作。