База данных номеров: нажмите на запись и откройте новое мероприятие

LordGash спросил: 28 апреля 2018 в 09:14 в: android

У меня есть база данных Room с клиентами. Я запускаю вид деятельности, где вы видите список клиентов.

Я хочу нажать на конкретного клиента и начать работу, где я могу увидеть более подробную информацию о клиенте.

Я знаю, что вам нужно использовать метод OnClickListener, если вы хотите нажать на кнопку и начать новую деятельность. Но здесь мой список составлен с помощью CardView.

Как я могу щелкнуть клиентом и открыть новое действие? И как мне позволить базе данных дать мне правильную информацию о правильном клиенте, например: "Если у меня есть Питер в моем списке, как я могу нажать на него и увидеть больше информации о нем? Мне нужно что-то вроде get (position) в методе для просмотра информации, связанной с этим идентификатором клиента?

Это мой список. Каждая карта состоит из клиента в этом списке. Но карты не являются кнопками, и у них нет кнопки.


2 ответа

Есть решение
Demigod ответил: 30 апреля 2018 в 09:33

Так как это список 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) создает намерение, которое запускает второе действие и передает идентификатор в качестве дополнительного. В вашем втором действии извлекайте идентификатор клиента из базы данных намерений и вызовов, чтобы получить его информацию.

Обновлено с версией Java

Создать интерфейс CustomerClickListener, который будет использоваться для взаимодействия с элементами просмотра recycler.

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 добавьте этот статический метод, который добавит идентификатор клиента к намерению.

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

И в CustomerInfoActivity получить идентификатор клиента как thispublic class 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 {
        // ...
    }
}

}

LordGash ответил: 28 апреля 2018 в 01:29
Хорошо, я попробую, и я опубликую свои результаты.
LordGash ответил: 28 апреля 2018 в 01:44
Что мне нужно изменить в этом коде (Kotlin), чтобы настроить его для java?
LordGash ответил: 28 апреля 2018 в 09:00
public void onCustomerClick (int position) {public void onClick (View v) {listener.onCustomerClick (getAdapterPosition ()); }} Я не могу полностью написать метод в основном действии. Это код, который я должен написать в нем? Но View v и AdapterPosition отмечены красным. Метод находится в теле класса, а не в теле onCreate. Что я делаю неправильно?
Demigod ответил: 29 апреля 2018 в 05:59
Чтобы реализовать механизм RecyclerView onItemClick, вы можете следовать этому руководству - antonioleiva.com/recyclerview-listener.
LordGash ответил: 29 апреля 2018 в 12:13
Я просмотрел его учебник, но не могу понять, как его реализовать в основной деятельности. В учебнике используется recycler.setAdapter, но я не могу записать это в свой код, он отмечен красным. Кроме того, как я должен реализовать свой код с идентификатором и намерением в основном действии в java?
Sahil ответил: 28 апреля 2018 в 09:43

Используйте 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);
  }
}); 

Надеюсь, что это поможет!