wake-up-neo.com

RecyclerView onClickListener

Nach 5 Monaten Webentwicklung musste ich also wieder in Android einsteigen, aber ich merkte, dass ein Teil meines alten Codes nicht mehr funktioniert. Ich habe ein RecyclerView mit einem Adapter für die Daten, aber der onClickListener für die Elemente reagiert auf nichts. So sieht mein Code aus:

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();
    }
}

ProjekteAktivität.Java

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

Die Liste wird angezeigt, der Klick funktioniert nicht, auch nicht das Protokoll der Konsole. Weiß jemand, was ich falsch gemacht habe? Ich verwende SDK v23 als kompilierte SDK-Version. Meine minimale SDK-Version ist v19.

6
Jordy

fügen Sie einen Klick hinzu, nachdem Sie Ansicht wie folgt gefunden haben:

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

Setzen Sie den Listenersteller für Elementklicks auf die Zeile "Recycler":

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

Sie haben ClickListener nicht auf textView oder Anything gesetzt. An welcher View soll onClick anrufen?

2

Schritt 1: Konstruktor ändern

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

Schritt 2: Geben Sie einen Verweis auf die Schnittstelle an

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

Schritt 3: Übergeben Sie dem Adapter den Listener von Aktivität oder Fragment

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