![](/img/trans.png)
[英]click on item in viewList .. open new activity with data from database android
[英]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.