У меня есть приложение для Android, в котором я использовал RecyclerView, который показывает список контактов. Теперь я хочу, чтобы при выборе контактов звонил по указанному номеру.
Пока все, что он делает, это показывает контакты, но когда я нажимаю на него, он вызывает, он не выполняет никаких действий. Я не знаю, как поставить отметку
Пробовал с onClick() и с кнопочным элементом, но безуспешно
Мой код:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
private static final String TAG = "RecyclerViewAdapter";
Context mContext;
List<Contact> mData;
Dialog myDialog;
Button button;
public RecyclerViewAdapter(Context mContext, List<Contact> mData) {
this.mContext = mContext;
this.mData = mData;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v ;
v = LayoutInflater.from(mContext).inflate(R.layout.single_item_contact,parent,false);
final MyViewHolder vHolder = new MyViewHolder(v);
// Dialog ini
myDialog = new Dialog(mContext);
myDialog.setContentView(R.layout.dialog_contact);
myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
vHolder.item_contact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(mContext,"Text Click item : "+String.valueOf(vHolder.getAdapterPosition()),Toast.LENGTH_SHORT).show();
TextView dialog_name_tv = (TextView) myDialog.findViewById(R.id.dialog_name_id);
TextView dialog_phone_tv = (TextView) myDialog.findViewById(R.id.dialog_phone_id);
ImageView dialog_contact_img = (ImageView)myDialog.findViewById(R.id.dialog_img);
dialog_name_tv.setText(mData.get(vHolder.getAdapterPosition()).getName());
dialog_phone_tv.setText(mData.get(vHolder.getAdapterPosition()).getPhone());
dialog_contact_img.setImageResource(mData.get(vHolder.getAdapterPosition()).getPhoto());
myDialog.show();
}
});
return vHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.tv_name.setText(mData.get(position).getName());
holder.tv_phone.setText(mData.get(position).getPhone());
holder.img.setImageResource(mData.get(position).getPhoto());
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
private LinearLayout item_contact;
private TextView tv_name;
private TextView tv_phone;
private ImageView img;
public MyViewHolder(View itemView) {
super(itemView);
item_contact = (LinearLayout) itemView.findViewById(R.id.contact_item_id);
tv_name = (TextView) itemView.findViewById(R.id.name_contact);
tv_phone = (TextView) itemView.findViewById(R.id.phone_contact);
img = (ImageView) itemView.findViewById(R.id.img_contact);
}
}
}
Aquí muestro mi XML de como tengo. Помоги пожалуйста
<RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "350dp"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_alignParentLeft = "true"
android:layout_alignParentStart = "true"
android:layout_alignParentTop = "true"
android:layout_marginTop = "15dp"
android:background = "#232323"
android:gravity = "center_horizontal"
android:orientation = "vertical">
<TextView
android:id = "@+id/dialog_name_id"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginTop = "90dp"
android:text = "Contact Name"
android:textColor = "@android:color/white"
android:textSize = "30sp"
android:textStyle = "bold" />
<TextView
android:id = "@+id/dialog_phone_id"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginBottom = "10dp"
android:layout_marginTop = "5dp"
android:text = "Phone Number"
android:textColor = "@android:color/white"
android:textSize = "23sp" />
<Button
android:id = "@+id/dialog_btn_call"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_gravity = "start"
android:layout_marginTop = "10dp"
android:background = "@android:color/white"
android:drawableLeft = "@drawable/dialog_call_black"
android:drawablePadding = "20dp"
android:padding = "20dp"
android:text = "Llamar"
android:textAlignment = "textStart"
android:textSize = "25dp" />
<Button
android:id = "@+id/dialog_btn_msg"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_gravity = "start"
android:background = "@android:color/white"
android:drawableLeft = "@drawable/dialog_message_black"
android:drawablePadding = "20dp"
android:padding = "20dp"
android:text = "Mensaje"
android:textAlignment = "textStart"
android:textSize = "25dp" />
</LinearLayout>
<ImageView
android:id = "@+id/dialog_img"
android:layout_width = "120dp"
android:layout_height = "120dp"
android:src = "@drawable/ic_contacts"
android:padding = "10dp"
android:layout_centerHorizontal = "true"
android:layout_alignParentTop = "true"
/>
</RelativeLayout>
Просто поместите кодовый блок vHolder.item_contact.setOnClickListener в OnBindViewHolder
Я думаю, вам стоит проверить ссылку ниже Это
Да, я хочу, чтобы выбранный контакт позвонил на ваш номер
Используйте следующий код: - String number = "1234" Intent intent = new Intent (Intent.ACTION_CALL); intent.setData (Uri.parse ("тел:" + номер)); startActivity (намерение); добавить разрешение в файл манифеста как: - <uses-permission android: name = "android.permission.CALL_PHONE"> </ uses-permissi on>
разбил приложение с этим кодом
Вам нужно поместить setOnClickListener () в OnBindViewHolder (). Насколько я понимаю, у вас есть Recycler View, в котором при нажатии элемента вы хотите открыть диалоговое окно dialog_contact, и это диалоговое окно содержит контактную информацию. После открытия этого диалогового окна вы хотите вызвать этому человеку, нажав кнопку вызова в диалоговом окне.
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.tv_name.setText(mData.get(position).getName());
holder.tv_phone.setText(mData.get(position).getPhone());
holder.img.setImageResource(mData.get(position).getPhoto());
holder.item_contact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDialog = new Dialog(mContext);
myDialog.setContentView(R.layout.dialog_contact);
myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
myDialog.show();
TextView dialog_name_tv = (TextView)myDialog.findViewById(R.id.dialog_name_id);
Button dialog_btn_call= (Button )myDialog.findViewById(R.id.dialog_btn_call);
TextView dialog_phone_tv = (TextView) myDialog.findViewById(R.id.dialog_phone_id);
ImageView dialog_contact_img = (ImageView)myDialog.findViewById(R.id.dialog_img);
dialog_name_tv.setText(mData.get(vHolder.getAdapterPosition()).getName());
dialog_phone_tv.setText(mData.get(vHolder.getAdapterPosition()).getPhone());
dialog_contact_img.setImageResource(mData.get(vHolder.getAdapterPosition()).getPhoto());
dialog_btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Do your code here
myDialog.dismiss();
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" +mData.get(holder.getAdapterPosition()).getPhone()));
mContext.startActivity(intent);
}
});
}
});
}
Редактировать:-
Я получаю ошибки в vHolder, это поле? и ошибка в activity.startActivity (intent); пожалуйста помоги
Извините, он будет держателем, я отредактировал свой ответ. Ставим держатель вместо vHolder
используйте этот mContext.startActivity (intent) в вашем случае.
Спасибо, если сработает. Есть какой-то способ сделать звонок напрямую без прохождения стокового приложения?
Нет, это хорошо, чтобы открыть номеронабиратель по умолчанию напрямую. Рад слышать, что это помогло. Тогда вы можете проголосовать и принять это.
Еще один быстрый вопрос. Выберите LinearLayout и сделайте вызов. Но я хочу, чтобы кнопка ("dialog_btn_call") выполняла вызов
Есть ли в вашем линейном макете кнопку dialog_btn_call?
Да, там есть кнопка, и оттуда я хочу, чтобы ты позвонил
Большое спасибо. Ты лучший.
Удовольствие все мое :)
Можете ли вы помочь мне в этом другом примере? Пожалуйста stackoverflow.com/questions/50051749/…
что именно ты хочешь? вам нужно вызвать выбранному контакту?