【问题标题】:Room database: click on a record and open a new activity房间数据库:单击一条记录并打开一个新活动
【发布时间】:2020-06-28 21:14:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你使用 DAO 和实体吗?
  • @TheLibrarianCz 是的,我愿意。

标签: android


【解决方案1】:

因为这是Customers 的列表,所以你需要一个点击监听器,就像这样

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,用于与recycler view items交互。

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 添加到intent。

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

并且在CustomerInfoActivity 中通过这样的客户ID 公共类 CustomerInfoActivity 扩展 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 {
        // ...
    }
}

}

【讨论】:

  • 好的,我去试试,我会发布我的结果。
  • 我必须在这段代码 (Kotlin) 中进行哪些更改才能为 java 调整它?
  • public void onCustomerClick(int position){ public void onClick(View v) { listener.onCustomerClick(getAdapterPosition());我无法在主活动中完全编写方法。这是我应该写的代码吗?但是 View v 和 AdapterPosition 标记为红色。该方法在类的主体中,而不是在 onCreate 的主体中。我做错了什么?
  • 要实现RecyclerView的onItemClick机制,可以按照这个教程-antonioleiva.com/recyclerview-listener.
  • 我浏览了他的教程,但不知道如何在主要活动中实现它。本教程使用 recycler.setAdapter 但我无法将其写入我的代码,它被标记为红色。另外,我应该如何将带有 ID 和意图的代码实现到 java 中的主要活动中?
【解决方案2】:

在您的列表视图中使用 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);
  }
}); 

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多