【问题标题】:Can i call an activity's view from a class?我可以从类中调用活动的视图吗?
【发布时间】:2023-01-22 23:26:54
【问题描述】:

我有一个很酷的问题,我一直在努力弄清楚。 我有一个名为 Bill 的活动,它有一个 Textview 和一个 RecyclerView。我计划使用 textview 来计算我的账单,而 recyclerView 将显示这些账单。 但问题是,当我处理 RecyclerView 的 Viewholder 数据时,适配器中有一个按钮可以清除账单,以防客户退货或取消订单。 现在的问题是我不知道如何为 TextView 设置 Text,谁能帮我回答这个问题?谢谢。

这是我提到的比尔活动

    package anhtuan.example.sample.feature;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.os.Bundle;
    import android.widget.TextView;

    import java.util.ArrayList;

    import anhtuan.example.sample.Bill.Bill_RecyclerView_Adapter;
    import anhtuan.example.sample.DAO.DAO;
    import anhtuan.example.sample.Model.BillModel;
    import anhtuan.example.sample.R;

    public class Bill extends AppCompatActivity {
    TextView bill_total;
    RecyclerView bill_RecyclerView;

    ArrayList<BillModel>bills;
    DAO dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bill);
        setTitle("Bill");
        bill_total = findViewById(R.id.bill_total);
        bill_RecyclerView = findViewById(R.id.bill_recyclerView);
        getSupportActionBar().hide();

        bills=new ArrayList<>();
        dao = new DAO(Bill.this);
        bills= dao.getDSBill();

        bill_total.setText("Bills: "+dao.CountBill());
        Bill_RecyclerView_Adapter adapter = new Bill_RecyclerView_Adapter(bills,Bill.this,dao);
        bill_RecyclerView.setLayoutManager(new      LinearLayoutManager(Bill.this,RecyclerView.VERTICAL,false));
        bill_RecyclerView.setAdapter(adapter);

    }
    }

bill_total 是我用 DAO 类中名为 CountBill() 的函数计算账单的 textView

    public int CountBill(){
        SQLiteDatabase database = sqLite.getReadableDatabase();
        Cursor c = database.rawQuery("select * from bill ",new String[]{});
        int sum = c.getCount();
        c.close();
        return sum;
    }

这是 RecyclerView 适配器

    package anhtuan.example.sample.Bill;

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;

    import java.util.ArrayList;

    import anhtuan.example.sample.DAO.DAO;
    import anhtuan.example.sample.Model.BillModel;
    import anhtuan.example.sample.R;

    public class Bill_RecyclerView_Adapter extends RecyclerView.Adapter<Bill_RecyclerView_Viewholder> {

    ArrayList<BillModel> bills;
    Context context;
    DAO dao;

    public Bill_RecyclerView_Adapter(ArrayList<BillModel> bills, Context context, DAO dao) {
        this.bills = bills;
        this.context = context;
        this.dao = dao;
    }

    @NonNull
    @Override
    public Bill_RecyclerView_Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)     {
        View view = LayoutInflater.from(context).inflate(R.layout.bill_viewholder,parent,false);
        return new Bill_RecyclerView_Viewholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Bill_RecyclerView_Viewholder holder, int position) {
        BillModel billModel;
        billModel = bills.get(position);
        holder.picture.setImageBitmap(billModel.BillBookPicture);
        holder.name.setText(billModel.BillBookName);
        holder.category.setText("Tag: "+billModel.BillBookCategory);
        holder.date.setText("Date: "+billModel.BillDate);
        holder.money.setText("Money: "+billModel.BillMoney);
        holder.sale.setText("Sale: "+billModel.BillSale);
        holder.totalSale.setText("Total: "+billModel.BillTotalSale);
        holder.del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dao.BillDel(billModel.id);
                bills = dao.getDSBill();
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        return bills.size();
    }
    }

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    在 Android 中,可以从类中调用 Activity 的视图,但不推荐这样做。

    Android 中的活动旨在处理用户界面和用户交互,而其他类应专注于处理逻辑和数据。

    如果您需要从单独的类访问 Activity 的视图,最好通过回调或接口来完成。

    一种方法是在类中创建一个接口并在活动中实现它。然后该类可以调用接口上的方法来更新视图。

    例子:

    // The interface in the class
    public interface ViewUpdater {
        void updateView();
    }
    
    // The class
    public class MyClass {
        private ViewUpdater viewUpdater;
        public void setViewUpdater(ViewUpdater viewUpdater) {
            this.viewUpdater = viewUpdater;
        }
    
        public void someMethod() {
            // do some work
            viewUpdater.updateView();
        }
    }
    
    // The activity
    public class MyActivity extends AppCompatActivity implements ViewUpdater {
        private MyClass myClass;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            myClass = new MyClass();
            myClass.setViewUpdater(this);
        }
    
        @Override
        public void updateView() {
            // Update the view
        }
    }
    

    实现此目的的另一种方法是使用回调,其中类可以调用活动传递给它的回调函数。

    无论如何,重要的是要牢记关注点分离原则并避免将类与活动紧密耦合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2011-06-16
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多