web-dev-qa-db-fra.com

RecyclerView onClickListener

Donc, après 5 mois de développement web, je devais revenir à Android, mais j’ai remarqué que certains de mes anciens codes ne fonctionnaient plus. J'ai un RecyclerView avec un adaptateur pour les données, mais le onClickListener pour les éléments ne répond à rien. Voici à quoi ressemble mon code:

public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> {
    private List<Project> itemsData;

    OnItemClickListener mItemClickListener;

    public ProjectAdapter(List<Project> itemsData) {
        this.itemsData = itemsData;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new views
        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);

        // create ViewHolder
        ViewHolder vh = new ViewHolder(itemLayoutView);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {


        viewHolder.txtViewId.setText(String.valueOf(itemsData.get(position).getId()));
        viewHolder.txtViewName.setText(itemsData.get(position).getName());


    }

    // inner class to hold a reference to each item of RecyclerView
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public TextView txtViewName, txtViewId;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
            txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);

        }

        @Override
        public void onClick(View v) {
            System.out.println("onClick");
            TextView tv = (TextView) v.findViewById(R.id.item_name);
            String id = tv.getText().toString();
            mItemClickListener.onItemClick(v, getAdapterPosition(), id); //OnItemClickListener mItemClickListener;
        }
    }

    public interface OnItemClickListener {
        public void onItemClick(View view, int position, String id);
    }

    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    // Return the size of your itemsData (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return itemsData.size();
    }
}

ProjetsActivité.Java

projectAdapter.SetOnItemClickListener(new ProjectAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View v, int position, String id) {
        System.out.println("onItemClick" + id);
        ActionActivity(id);
    }
});

La liste est affichée, le clic ne fonctionne pas, pas même le journal de la console ... Est-ce que quelqu'un sait ce que j'ai fait de mal? J'utilise SDK v23 en tant que version compilée de sdk. Ma version minimale du SDK est v19.

6
Jordy

ajoutez un clic après avoir trouvé une vue comme celle-ci:

public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
            txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
           // here 
           itemLayoutView.setOnClickListener(this);
        }
12
Cold Fire

Définissez le clic sur l'élément d'écoute sur la ligne de vue du recycleur:

public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        itemLayoutView.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                   TextView tv = (TextView) v.findViewById(R.id.item_name);
                   String id = tv.getText().toString();
                   mItemClickListener.onItemClick(getLayoutPosition(), v, id);
              }
        });
        txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
        txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);

    }
2
R. Zagórski

Vous n'avez pas défini ClickListener sur textView ou Anything. Sur quelle View est-ce que onClick est appelé?

2
kashyap jimuliya

Étape 1: Changer de constructeur

 public ProjectAdapter(List<Project> itemsData,OnItemClickListener itemClickListener) {
        this.itemsData = itemsData;
        onItemClickListener = itemClickListener;
    }

Étape 2: référence à l'interface

 public MyViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);    
}

Étape 3: Donnez à l’auditeur l’adaptateur de l’activité ou le fragment

MyAdapter myAdapter = new MyAdapter (list, this);
1