繁体   English   中英

房间数据库:点击一个记录并打开一个新的活动

[英]Room database: click on a record and open a new activity

我有一个与客户的Room数据库。 我开始一项活动,您可以在其中看到客户列表。

我想单击特定客户并开始一项活动,在那里我可以查看该客户的更多详细信息。

我知道如果你想点击一个按钮并开始一个新的活动,你需要使用OnClickListener方法。 但在这里,我的列表是用CardView 制作的

如何单击客户并打开新活动? 以及如何让数据库为我提供正确客户的正确信息,例如:如果我的列表中有彼得,我如何点击他并查看有关他的更多信息? 我是否需要在方法中使用 get(position) 之类的东西来查看与该客户 ID 相关的信息?

在此处输入图片说明

这是我的清单。 每张卡都包含此列表中的一个客户。 但是卡片不是按钮,它们没有按钮。

由于这是Customer的列表,因此您需要一个单击侦听器,如下所示

interface CustomerClickListener {
    fun onCustomerClick(position:Int)
}

您将在您的Activity实现并将传递给您的Adapter:RecyclerView.Adapter 在适配器中,当单击项目时调用此侦听器。

class CustomerHolder(listener:CustomerClickListener, view:View):RecyclerView.ViewHolder(view) {
    //...
    view.setOnClickListener { listener.onCustomerClick(adapterPosition) } 
}

在您将实现 CustomerClickListener 的活动中,使用单击的客户的id调用第二个活动。 像这样

override fun onCustomerClick(position:Int) {
    val id = customers[position].id ?: return
    CustomerInfoActivity.open(id)
}

方法CustomerInfoActivity.open(id)创建一个启动第二个活动的意图并传递一个 id 作为额外的。 在您的第二个活动中,从意图和调用数据库中检索传递的客户 ID 以获取其信息。

更新了 Java 版本

创建接口CustomerClickListener ,该接口将用于与回收站视图项进行交互。

public interface CustomerClickListener {
    void onCustomerClick(int position);
}

将此接口作为参数添加到您的Adapter构造函数。

public class CustomersAdapter extends RecyclerView.Adapter<CustomerHolder> {
    private CustomerClickListener listener;

    public CustomersAdapter(CustomerClickListener listener) {
        this.listener = listener;
    }

    class CustomerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private CustomerClickListener listener;

        CustomerHolder(View itemView, CustomerClickListener listener) {
            super(itemView);
            this.listener = listener;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (listener != null) {
                listener.onCustomerClick(getAdapterPosition());
            }
        }
    }
}

从上面实现接口并将其传递给适配器。 像这样:

public class MyActivity extends Activity implements CustomerClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        recyclerView = findViewById(R.id.recycler_view);
        CustomersAdapter adapter = new CustomersAdapter(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onCustomerClick(int position) {
        // Get customer based on the position from the customers list
        Customer customer = customers.get(position);
        CustomerInfoActivity.open(this, customer.getId());
    }
}

CustomerInfoActivity添加这个静态方法,它将把客户 id 添加到意图中。

public static void open(Activity activity, long customerId) {
    Intent intent = new Intent(activity, CustomerInfoActivity.class);
    intent.putExtra("CustomerID", customerId);
    activity.startActivity(intent);
}

而在CustomerInfoActivity像这个公共类 CustomerInfoActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    Intent intent = getIntent();
    if (intent != null && intent.hasExtra("CustomerID")) {
        long customerId = intent.getLongExtra("CustomerID", -1);
        // TODO: get customer details based on customer id
    } else {
        // ...
    }
}

}

在您的列表视图中使用 setOnItemClickListener() 来检测用户点击的项目,并通过捆绑将相关数据传递给您的活动,如下例所示:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                     Intent intent = new Intent(RoomActivity.this, CustomerDetailActivity.class);
                     intent.putExtra(CUSTOMER_ID, listData.get(position).getId();
                     startActivity(intent);
  }
}); 

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM