2016-07-04 31 views
2

Also nach 5 Monaten Webentwicklung musste ich wieder in Android, aber ich bemerkte, dass einige meiner alten Code nicht mehr funktioniert. Ich habe ein RecyclerView mit einem Adapter für die Daten, aber der onClickListener für die Elemente reagiert auf nichts. Dies ist, was mein Code wie folgt aussieht:RecyclerView onClickListener

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

ProjectsActivity.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 zeigt wird, wird der Klick nicht funktioniert, nicht einmal das Protokoll an die Konsole. Weiß jemand, was ich falsch gemacht habe? Ich verwende SDK v23 als kompilierte SDK-Version. Meine minimale SDK-Version ist v19.

+1

Sehen Sie diese http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview- is-diff? rq = 1 – Borja

Antwort

7

fügen Sie ein Klick nach Ansicht der Suche nach

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); 
     } 
+0

oh ... mein ...... wie habe ich das vermisst. Ich danke dir sehr. Ich habe bereits versucht, den genauen Code zu meinem onCreateViewHolder hinzuzufügen. So dumm von mir, es nicht zum ViewHolder hinzuzufügen. – Jordy

+0

müssen 1 min warten, bevor Sie akzeptieren ^^ – Jordy

+0

Dies kann funktionieren, aber ist nicht der richtige Weg, wie es geht. Folge diesem. http://stackoverflow.com/a/26196831/1137730 – Klevi01

2

Sie haben ClickListener nicht auf textView oder Anything gesetzt. Auf was View soll onClick anrufen?

1

Schritt 1: Ändern Constructor

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

Schritt 2: Geben Sie Referenz

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

Schritt 3 Schnittstelle: Hörer Geben Sie an Adapter von Aktivität oder Fragment

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

Set Artikel klicken Hörer Ansicht 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); 

    } 
Verwandte Themen