获取在RecyclerView中单击的特定项目的ID

时间:2018-05-14 13:13:41

标签: android android-recyclerview recycler-adapter recyclerview-layout

我在OnItemClickListener接口的OnItemClicked(int position,View v)方法中传递位置和视图。现在在我的ViewReceptionistActivity中,我想检查哪个项目和哪个子部分被点击。如果用户单击图像,则执行任务A els,如果用户单击名称执行任务B,依此类推..

这是我的布局文件 - viewreceptionist_item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    cardElevation="5dp"
    contentPadding="10dp"
    app:cardCornerRadius="20dp"
    app:cardUseCompatPadding="true"
    xmlns:android="http://schemas.android.com/apk/res/android">

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="12"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:background="@drawable/card_background">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:layout_weight="2">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/viewReceptionistImage"
            android:layout_width="70dp"
            android:layout_height="70dp"
            app:civ_border_width="2dp"
            android:layout_gravity="center"
            app:civ_border_color="@color/black" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_marginLeft="10dp"
        android:layout_weight="9">

        <TextView
            android:id="@+id/textViewViewReceptionistName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:textSize="18dp"
            android:layout_marginTop="5dp"
            android:textColor="@color/black"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/textViewViewReceptionistEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Email"
            android:textSize="15dp"
            android:layout_marginTop="5dp"
            android:textColor="@color/black"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/textViewViewReceptionistMobile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Mobile No."
            android:textSize="15dp"
            android:layout_marginTop="5dp"
            android:textColor="@color/black"
            android:textStyle="bold"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:layout_weight="1">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/viewReceptionistGender"
            android:layout_width="40dp"
            android:layout_height="40dp"
            app:civ_border_width="2dp"
            android:layout_gravity="center"
            app:civ_border_color="@color/black" />

    </LinearLayout>

</LinearLayout>
</android.support.v7.widget.CardView>

这是我的适配器 - ViewReceptionistAdapter

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class ViewReceptionistAdapter extends RecyclerView.Adapter<ViewReceptionistAdapter.ViewReceptionistHolder>
{
    Context context;
    int resource;
    ArrayList<Receptionist> objects;

    OnItemClickListener listener;

    public interface OnItemClickListener
    {
        void OnItemClicked(int position, View v);
    }

    public void setOnItemClickListener(OnItemClickListener listener)
    {
        this.listener = listener;
    }

    public ViewReceptionistAdapter(Context context, int resource, ArrayList<Receptionist> objects)
    {
        this.context = context;
        this.resource = resource;
        this.objects = objects;
    }

    @Override
    public ViewReceptionistHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(context).inflate(resource, parent, false);

        ViewReceptionistHolder viewReceptionistHolder = new ViewReceptionistHolder(view);

        return viewReceptionistHolder;
    }

    @Override
    public void onBindViewHolder(ViewReceptionistHolder holder, int position)
    {
        Receptionist receptionist = objects.get(position);

        holder.tvViewReceptionistName.setText(receptionist.name);
        holder.tvViewReceptionistEmail.setText(receptionist.email);
        holder.tvViewReceptionistMobile.setText(receptionist.mobile);

        String url = receptionist.imageUrl;
        Picasso.get().load(url).into(holder.viewReceptionistImage);


        String gender;

        gender = receptionist.gender;

        if(gender.equals("Male"))
        {
            holder.viewReceptionistgender.setImageResource(R.drawable.male_icon);
        }
        else
        {
            holder.viewReceptionistgender.setImageResource(R.drawable.female_icon);
        }
    }

    @Override
    public int getItemCount()
    {
        return objects.size();
    }

    public class ViewReceptionistHolder extends RecyclerView.ViewHolder
    {

        public TextView tvViewReceptionistName;
        public TextView tvViewReceptionistEmail;
        public TextView tvViewReceptionistMobile;
        public CircleImageView viewReceptionistImage;
        public CircleImageView viewReceptionistgender;

        public ViewReceptionistHolder(final View itemView)
        {
            super(itemView);

            tvViewReceptionistName = itemView.findViewById(R.id.textViewViewReceptionistName);
            tvViewReceptionistEmail = itemView.findViewById(R.id.textViewViewReceptionistEmail);
            tvViewReceptionistMobile = itemView.findViewById(R.id.textViewViewReceptionistMobile);

            viewReceptionistImage = itemView.findViewById(R.id.viewReceptionistImage);
            viewReceptionistgender = itemView.findViewById(R.id.viewReceptionistGender);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    if(listener != null)
                    {
                        int position = getAdapterPosition();

                        if(position != RecyclerView.NO_POSITION)
                        {
                            listener.OnItemClicked(position, v);
                        }
                    }

                }
            });
        }
    }
}

这是ViewReceptionistActivity

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

public class ViewReceptionistActivity extends AppCompatActivity
{
    RecyclerView recyclerView;
    ArrayList<Receptionist> receptionistsList;

    ViewReceptionistAdapter viewReceptionistAdapter;

    FirebaseFirestore firestore;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_receptionist);

        getSupportActionBar().setTitle("View Receptionist");

        recyclerView = (RecyclerView)findViewById(R.id.recyclerView);

        firestore = FirebaseFirestore.getInstance();
        receptionistsList = new ArrayList<Receptionist>();


        Query query = firestore.collection("Receptionist").orderBy("name", Query.Direction.ASCENDING);

        query.addSnapshotListener(this, new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e)
            {
                for(DocumentSnapshot documentSnapshot: documentSnapshots)
                {
                    Receptionist receptionist = documentSnapshot.toObject(Receptionist.class);
                    receptionistsList.add(receptionist);

                    viewReceptionistAdapter.notifyDataSetChanged();
                }
            }
        });

        viewReceptionistAdapter = new ViewReceptionistAdapter(this, R.layout.viewreceptionist_item, receptionistsList);

        viewReceptionistAdapter.setOnItemClickListener(new ViewReceptionistAdapter.OnItemClickListener() {
            @Override
            public void OnItemClicked(int position, View v)
            {

                Toast.makeText(ViewReceptionistActivity.this, "You Clicked " + position + " " + v, Toast.LENGTH_SHORT).show();

//HERE I WANT TO CHECK IF USER CLICKS AN IMAGE OR NAME OR EMAIL...
//IF USER CLICKS IMAGE - PERFORM TASK A
//IF USSER CLICKS NAME - PERFORM TASK B...AND SO ON


            }
        });

        LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);


        recyclerView.setLayoutManager(manager);
        recyclerView.setAdapter(viewReceptionistAdapter);

    }
}

我想从视图中点击特定项目...

1 个答案:

答案 0 :(得分:3)

您最好使用针对每个视图的方法扩展您的点击界面,以便为点击事件添加反应:

public interface OnItemClickListener
    {
        void OnItemImageClicked(int position, View v);
        void OnItemNameClicked(int position, View v);
    }

并在你的视图中持有人:

viewReceptionistImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    if(listener != null)
                    {
                        int position = getAdapterPosition();

                        if(position != RecyclerView.NO_POSITION)
                        {
                            listener.OnItemImageClicked(position, v);
                        }
                    }

                }
            });


tvViewReceptionistName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    if(listener != null)
                    {
                        int position = getAdapterPosition();

                        if(position != RecyclerView.NO_POSITION)
                        {
                            listener.OnItemNameClicked(position, v);
                        }
                    }

                }
            });

然后在ViewReceptionistActivity中,您只需实现接口并覆盖方法(因为它们会很多)。 然后在适配器中设置监听器,如下所示:

viewReceptionistAdapter.setOnItemClickListener(this);

或者您可以使用旧方式:

viewReceptionistAdapter.setOnItemClickListener(new ViewReceptionistAdapter.OnItemClickListener() {
            @Override
            public void OnItemImageClicked(int position, View v)
            {
             Toast.makeText(ViewReceptionistActivity.this, "You Clicked " + position + "Image View: " + v, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void OnItemNameClicked(int position, View v)
            {
              Toast.makeText(ViewReceptionistActivity.this, "You Clicked " + position + " TextView: " + v, Toast.LENGTH_SHORT).show();

            }
        });