【问题标题】:TextView not updating when deleting record in custom adapter删除自定义适配器中的记录时,TextView 不更新
【发布时间】:2013-12-13 13:35:12
【问题描述】:

我有一个在 ListView 中显示记录的类。用户可以删除记录,并且每次用户删除记录时,我都想用新值从我的布局中更新 TextView

我有一个 XML 布局页面,这是一个引用自定义适配器的类。当用户删除一条记录时,我从另一个类(HistoryOverview.java)触发一个函数,我想在其中更新文本视图。 问题是我的所有代码都没有错误,但我的 TextView 没有更新值。我是在这里遗漏了什么还是做错了什么?

1.布局.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TableRow
            android:paddingLeft="5dp"
            android:paddingTop="5dp" >

            <ImageView
                android:id="@+id/barGraphUsed"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|bottom"
                android:background="#808080"
                android:contentDescription="@string/emptyTextfield" />
        </TableRow>


            <TextView
                android:id="@+id/overviewFinances"
                android:paddingLeft="5dp"
                android:paddingTop="5dp"
                android:textColor="#97ca3e"
                android:text="@string/emptyTextfield"
                android:textSize="16sp" />
    </TableLayout>

    <ListView
        android:id="@+id/listViewFinances"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:dividerHeight="1dp"
        android:paddingBottom="50dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="20dp" />

</LinearLayout>

2。自定义适配器

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.listviewitem_history, parent,
                false);
        //if users delete something
        final ImageView deleteFinance = (ImageView) rowView.findViewById(R.id.deleteFinance);

                //on long click to really delete the category.
                deleteFinance.setOnLongClickListener(new AdapterView.OnLongClickListener(){

                    public boolean onLongClick(View view) {
                        //getting id that we set in the tag a bit higher.
                        String financeId = view.getTag().toString();

                        //now convert to long to input in the db.
                        long deleteId = Long.valueOf(financeId);

                        //delete the note from the db, from the listview and update the adapter.
                        db.deleteFinance(deleteId);
                        values.remove(position);


                        getTotalIncomesAndExpenses();

                        notifyDataSetChanged();
                        return true;
                    }
                });

        //return the view.
        return rowView;
    }

    public void getTotalIncomesAndExpenses(){
        HistoryOverview HO = new HistoryOverview();

        //all the numbers get calculated here etc but I would like to keep this code private
        //its rather sensitive data. But all those variables are okay and do work.
        HO.notifyChange(sumExpenses, sumIncomes, currency);
    }

所以当我完成删除记录等时,我会使用我的 HistoryOverview 类中的函数 notifyChange。然后我来这个函数:

3. HistoryOverview.Java

    public void notifyChange(int sumExpenses, int sumIncomes, String currency){
        Log.i("sumExpenses, incomes", String.valueOf(sumExpenses + " " + sumIncomes));
        LayoutInflater li = (LayoutInflater)contextForAdapter.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View vi = li.inflate(R.layout.activity_historyoverview, null);

        ListView listViewFinances = (ListView)vi.findViewById(R.id.listViewFinances);
        listViewFinances.setVisibility(vi.GONE);
        listViewFinances.setVisibility(View.GONE);
        vi.bringToFront();


        TextView tv = (TextView)vi.findViewById(R.id.overviewFinances);
        String text = "Sum incomes: " + sumIncomes + currency
                + "\tSum expenses: " + sumExpenses + currency
                + "\tMoney left: " + (sumIncomes - sumExpenses)
                + currency;
        tv.setText(text);
        tv.setBackgroundColor(Color.RED);

        Toast.makeText(contextForAdapter, 
                   text, Toast.LENGTH_LONG).show();
        Log.i("tv:", tv.getText().toString());
    }

我最终会在哪里更新 textView。但不知何故,它永远不会更新,尽管我的 toast 测试功能有效并且我的日志都显示了 textView 不会更新的正确值。谁能告诉我我做错了什么或我错过了什么?

【问题讨论】:

  • 从哪里获取列表视图项?
  • 我直接从数据中获取它们并将它们插入到列表视图中。

标签: android android-layout android-listview custom-adapter


【解决方案1】:

确保在调用 findViewById 时获得正确的 TextView。我相信你的电视不是你需要的 TextView 对象。您应该在正确的上下文中使用 findViewById。 如果您正在处理已经存在的视图,则无需夸大任何新内容。通过 id 找到它或以任何其他方式传递对视图的引用。

【讨论】:

  • 其实你给了我一个非常好的想法来解决这个问题。非常感谢 Ma :) 我刚刚在课堂上初始化了它并从中创建了一个私有静态,然后我可以以正确的方式访问它!非常感谢!
【解决方案2】:

改变这个

 getTotalIncomesAndExpenses();
 notifyDataSetChanged();

到这里

 notifyDataSetChanged();
 getTotalIncomesAndExpenses();

可能是一个原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2015-01-25
    相关资源
    最近更新 更多