更新数据库后如何在Recyclerview之外更新TextView

时间:2019-12-07 01:59:10

标签: android android-layout android-recyclerview android-adapter

我有一个活动,该活动分为两个部分:

第一个是“相对”布局,其中有一个TextView,它根据数据库中存储的数据显示总额。

第二部分是RecyclerView,它显示所有记录。 在适配器上,我可以更新和删除数据库中的信息,并且可以使用notifyItemRemoved(position)和notifyItemChanged(position)来反映对reclyclerview的更改。

我的问题是我找不到在相对布局上更新TextView的方法,我尝试在Activity上使用notifyDataSetChanged(),但是它没有使用数据库中的值总和重新加载列表。如果我从适配器使用它,则找不到在活动中访问TextView的方法。我还尝试在适配器上设置观察者,但它不能反映出更改。

adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
            tripRecordList = getStandardAmountList(tripRecordList);
            Collections.reverse(tripRecordList);
            mAmount.setText(String.valueOf(nf.format(getAmountStd(tripRecordList))));
        } 
    }
});

下面是代码片段。

活动布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context=".Activities.ViewTripRecord">

    <RelativeLayout
        android:id="@+id/viewrecordLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/viewrecordSummaryText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginBottom="@dimen/cardview_compat_inset_shadow"
            android:gravity="center"
            android:text="@string/trip_summary"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="20sp" />


        <TextView
            android:id="@+id/viewrecordTotalAmountText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/viewrecordSummaryText"
            android:layout_alignParentStart="true"
            android:padding="3dp"
            android:text="@string/amount"
            android:textSize="15sp"
            android:textStyle="italic|bold" />


        <TextView
            android:id="@+id/viewrecordTotalAmount"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/viewrecordSummaryText"
            android:layout_alignParentStart="true"
            android:layout_marginStart="95dp"
            android:padding="3dp"
            android:textSize="15sp" />


        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/viewrecordRecyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/viewrecordTotalAmountText"
            android:layout_alignParentStart="true"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

活动:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_view_trip_record);
        setTitle(getResources().getString(R.string.view_expenses));

        dbHandler = new DbHandler(this);       
        tripID = getIntent().getIntExtra("TripID",0);
        tripRecordList = dbHandler.getTripRecords(tripID);

        mAmount = findViewById(R.id.viewrecordTotalAmount);
        recyclerView = findViewById(R.id.viewrecordRecyclerView);
        setLayout();

    }

private void setLayout(){

    NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());
    nf.setMaximumFractionDigits(2);
    nf.setMinimumFractionDigits(2);
    if(tripRecordList.size()>0) {
            tripRecordList = getStandardAmountList(tripRecordList);
            Collections.reverse(tripRecordList);
            mAmount.setText(String.valueOf(nf.format(getAmountStd(tripRecordList))));
        }        
        recyclerView.setVisibility(View.VISIBLE);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new ViewTripRecordAdapter(tripRecordList, this);
        recyclerView.setAdapter(adapter);

}

Adpater:

    public class TripRecordView extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView stdAmount;
        private ImageButton infoButton, deleteButton, updateButton;
        public TripRecordView(@NonNull View itemView) {
            super(itemView);
            stdAmount = itemView.findViewById(R.id.viewtriptrecordStdAmount);
            deleteButton = itemView.findViewById(R.id.viewtriptrecordDelete);
            deleteButton.setOnClickListener(this);
            updateButton = itemView.findViewById(R.id.viewtriptrecordUpdateButton);
            updateButton.setOnClickListener(this);
        }


        @Override
        public void onClick(final View v) {
            final int position = getAdapterPosition();
            switch (v.getId()){
                case R.id.viewtriptrecordDelete:
                    deleteRecord(tripRecord2,position);
                    break;
                case R.id.viewtriptrecordUpdateButton:
                    updateRecord(tripRecord2,position,recordView );
                    break;
            }

        }
    }

    public void deleteRecord(TripRecord deletedRecord, int position){
                dbHandler = new DbHandler(context);
                dbHandler.deleteTripRecord(deletedRecord.getTripID(),deletedRecord.getId());
                tripRecordList.remove(position);
                notifyItemRemoved(position);
    }

    public void updateRecord(final TripRecord updatedRecord, final int position, final View view){
        EditText mAmount;

        mAmount = view.findViewById(R.id.insertrecordAmount);
        updatedRecord.setAmount(Double.valueOf(mAmount.getText().toString()));
        dbHandler.updateTripRecord(updatedRecord);
        notifyItemChanged(position);        
    }

谢谢, 奥黛尔

0 个答案:

没有答案