2017-08-16 2 views
-1

Ich möchte Element hinzufügen klicken Sie auf Listener zu meinem RecyclerView, so dass, wenn ich auf ein bestimmtes Element klickt, startet es eine neue Intent und ruft Daten von einem Webserver über dieses Element ab. Ich habe viele Vorschläge ausprobiert, aber keiner von ihnen hat geholfen.OnItemClickListener für eine RecyclerView

Meine RecylerView Klasse

public class GetPrice extends AppCompatActivity { 
private RecyclerView recyclerView; 
private GridLayoutManager gridLayoutManager; 
private CustomAdapter adapter; 
private List<MyData> dataList; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.getpricerecycle); 
    recyclerView =(RecyclerView) findViewById(R.id.recycler_view); 

    dataList = new ArrayList<>(); 
    load_data_from_server(0); 
    gridLayoutManager = new GridLayoutManager(this,1); 
    recyclerView.setLayoutManager(gridLayoutManager); 
    adapter = new CustomAdapter(this,dataList); 
    recyclerView.setAdapter(adapter); 

} 

private void load_data_from_server(final int id) { 
    AsyncTask<Integer,Void,Void> task = new AsyncTask<Integer, Void, Void>() { 
     @Override 
     protected Void doInBackground(Integer... params) { 
      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder().url("http://172.20.10.7/anfal/getPrice.php?id="+id).build(); 
      try { 
       Response response = client.newCall(request).execute(); 
       JSONArray array = new JSONArray(response.body().string()); 
       for(int i=0;i<array.length();i++){ 
        JSONObject jsonobject = array.getJSONObject(i); 
        MyData data=new MyData(jsonobject.getInt("id"),jsonobject.getString("name"),jsonobject.getString("price"),jsonobject.getString("image")); 
        dataList.add(data); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       System.out.println("End Of Content"); 
      } 


      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
task.execute(id); 

} 

hier ist mein coustm Adapter für den Recycler Ansicht

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {                 
     private Context context; 
     private List<MyData> my_data; 
     public CustomAdapter(Context context, List<MyData> my_data) { 
     this.context = context; 
     this.my_data = my_data; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.getpricecardview,parent,false); 
     return new ViewHolder(itemView); 

    } 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
      holder.name.setText(my_data.get(position).getName()); 
      holder.price.setText(my_data.get(position).getPrice()); 


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

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView name; 
     public TextView price; 
     public ImageView imageview; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      name=(TextView)itemView.findViewById(R.id.description); 
      price=(TextView) itemView.findViewById(R.id.nameofp); 
      imageview=(ImageView) itemView.findViewById(R.id.imgevie); 
     } 
    } 

} 
+0

versuchen, diese Antwort https://stackoverflow.com/questions/28296708/get-clicked-item-and-its-position-in-recyclerview – nKalai

+0

https://stackoverflow.com/a/35970486/1563038 –

Antwort

1

In Ihrem RecyclerView.Adapter einfach eine Schnittstelle erstellen Sie verwenden können.

private onItemClickListener mItemClickListener; 

public void setOnItemClickListener(onItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
} 

public interface onItemClickListener { 
    void onItemClickListener(View view, int position, MyData myData); 
} 

In diesem Fall mItemClickListener ist eine globale Variable in Ihrem Adapter und die beiden Methoden in Ihrem Adapter gehen, auch.

Dann in Ihrem ViewHolder einen Klick Zuhörer auf Ihre itemView mit itemView.setOnClickListener(this) anwenden (oder was auch immer Komponente Sie die Daten abgerufen werden sollen geklickt)

@Override 
public void onClick(View view) { 
    if (mItemClickListener != null) { 
     mItemClickListener.onItemClickListener(view, getAdapterPosition(), my_data.get(getAdapterPosition())); 
    } 
} 

Dies wird dann die Ansicht übergeben, die angeklickt wurde, die Position Diese Ansicht und das Objekt, das in dieser Liste enthalten ist.

So in Ihrem Activity können Sie dann einfach anrufen interface.

adapter.setOnItemClickListener(new CustomAdapter.onItemItemClickListener() { 
    @Override 
    public void onItemClickListener(View view, int position, MyData data) { 
    //do on item click functionality here 
    } 
}); 
1

Erster Weg

recyclerViewObject.addOnItemTouchListener(
     new RecyclerItemClickListener(
      getContext(), 
      recyclerViewObject, 
      new RecyclerItemClickListener.OnItemClickListener() { 
       @Override public void onItemClick(View view, int position) { 
        // view is the clicked view (the one you wanted 
        // position is its position in the adapter 
       } 
       @Override public void onLongItemClick(View view, int position) { 
       } 
      } 
     ) 
    ); 

Zweiter Weg

public interface PositionClickListener { 
    void itemClicked(int position); } 

in Adapter

public class MyRecyclerAdapter extends RecyclerView.Adapter 
{ 
    public final PositionClickListener listener; 

    public MyRecyclerAdapter(PositionClickListener listener) 
    { 
     this.listener = listener; 
    } 

    private void createView(int position) 
    { 
     View v = new View(); 
     v.setOnClickListener(new OnClickListener(){ 
      listener.itemClicked(position); 
     }); 
    } 
} 

Reference

0

Eigentlich die beste Praxis mit recyclerView und OnClickListener ist auf diese Weise zu tun:

In Ihrer Tätigkeit:

//Add this line in the onCreate method 
//Add more parameters if needed for your adapter 
DataAdapter myDataAdapter = new DataAdapter (context, myClickListener); 


private View.OnClickListener myClickListener = new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View view) 
    { 
     int position = view.getTag() 
     //Do something... 
    } 
}; 

Und in Ihrem Adapter

private View.OnClickListener myClickListener; 
private Context context; 

public DataAdapter (Context context, View.OnClickListener myClickListener) 
{ 
    this.context = context; 
    this.myClickListener = myClickListener; 
} 

public class ViewHolder extends RecyclerView.ViewHolder 
{ 

    //Your attributes 

    public myViewHolder(View v, View.OnClickListener myClickListener) 
    { 
     super(v); 
     v.setOnClickListener(myClickListener); 
    } 
} 

@Override 
public void onBindViewHolder(myViewHolder holder, int position) 
{ 
    holder.itemView.setTag(position) 
} 

Natürlich ist es für jede Art Werk KlickListener.

Hoffe diese Hilfe !!

0

Sie können einfach ändern ViewHolder

  public ViewHolder(View itemView) { 
      super(itemView); 

      name=(TextView)itemView.findViewById(R.id.description); 
      price=(TextView) itemView.findViewById(R.id.nameofp); 
      imageview=(ImageView) itemView.findViewById(R.id.imgevie); 



      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       // Here is the action 


       } 
      }); 


     } 
0

Click-Ereignis inside CustomAdapter.ViewHolder

itemView D.h. ArtikelansichtsetOnClickListener() und innerhalb onClick() Methode Position geklickt Artikel wie diese:

getAdapterPosition()

0

Der einfachste Weg Element klicken recyclerview zu implementieren, ist in onBindViewHolder Methode eines Adapters zu implementieren.

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { 
     vh.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //use position value to get clicked data from list 
      } 
     }); 
    } 
Verwandte Themen