【问题标题】:OnclickListener on RecylerView and getting the Id of clicked ItemRecyclerView 上的 OnclickListener 并获取单击项的 Id
【发布时间】:2017-07-07 05:54:09
【问题描述】:

我需要在 RecyclerView 上设置 onClickListener 以获取单击项目的 Json Id 并重定向到基于该 Json ID 显示产品详细信息的片段。如何在适配器中实现它?我被困在这里。我可以设置 onClickListener 但我无法获取 Json ID。

这是我的适配器。

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.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.dell.retroexample.MainActivity;
import com.example.dell.retroexample.R;
import com.example.dell.retroexample.apiHandlers.model.Ad;

import java.util.List;

/**
 * Created by dell on 7/3/2017.
 */

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{

    private List<Ad> ads;
    private Context context;



    public RecyclerAdapter(List<Ad> ads, Context context){
        this.ads=ads;
        this.context=context;

    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_ads, parent,false);
        return  new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.name.setText(ads.get(position).getTitle());
        holder.details.setText("Rs. " +ads.get(position).getPrice().toString()+ "/-");
//        Glide.with(context).load(ads.get(position).getPhoto1()).into(holder.thumbnail);



    }

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




    public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        ImageView thumbnail;
        TextView name, details;
        public MyViewHolder(View itemView) {
            super(itemView);
//            thumbnail=(ImageView)itemView.findViewById(R.id.thumbnail);
            name=(TextView)itemView.findViewById(R.id.title);
            details=(TextView)itemView.findViewById(R.id.price);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            Toast.makeText(view.getContext(), "Clicked on Recycler View" , Toast.LENGTH_SHORT).show();
        }



    }
}

这是我的 MainActivity

package com.example.dell.retroexample;

import android.content.res.Resources;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;

import com.example.dell.retroexample.apiHandlers.adapter.RecyclerAdapter;
import com.example.dell.retroexample.apiHandlers.model.Ad;
import com.example.dell.retroexample.apiHandlers.rest.ApiInterface;
import com.example.dell.retroexample.apiHandlers.rest.ApiClient;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerAdapter adapter=null;
    private List<Ad> ads;
    private ApiInterface apiInterface;



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


        recyclerView=(RecyclerView)findViewById(R.id.ads_recycler_view);
                // calculating the number of columns
        int columns=2;
        DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
        double widthPixels = lDisplayMetrics.widthPixels;
        Log.e("Width", String.valueOf(widthPixels));
        columns=(int)widthPixels/dpToPx(170);


        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this,  columns);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());


        apiInterface=ApiClient.getClient().create(ApiInterface.class);

        Call <List<Ad>> call=apiInterface.getads();

        call.enqueue(new Callback<List<Ad>>() {
            @Override
            public void onResponse(Call<List<Ad>> call, Response<List<Ad>> response) {
                ads=response.body();
                adapter=new RecyclerAdapter(ads, MainActivity.this);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onFailure(Call<List<Ad>> call, Throwable t) {

                Log.e(TAG, t.toString());
            }
        });




    }

    private int dpToPx(int dp) {
        Resources r = getResources();
        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
    }

}

【问题讨论】:

    标签: android android-layout android-studio android-fragments


    【解决方案1】:
    @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.name.setText(ads.get(position).getTitle());
            holder.details.setText("Rs. " +ads.get(position).getPrice().toString()+ "/-");        Glide.with(context).load(ads.get(position).getPhoto1()).into(holder.thumbnail);
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String id=ads.get(position).getId();
                    //You can call detail fragment here
                }
            });
        }
    

    注意:从 ViewHolder 中移除 onclick 监听器

    【讨论】:

      【解决方案2】:

      使用下面的类试试这个,你可以获得 recyclerview onclick listener 和 longclick listneeers

      创建一个RecyclerItemClickListener

      public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
      private OnItemClickListener mListener;
      
      public interface OnItemClickListener {
          public void onItemClick(View view, int position);
      
          public void onLongItemClick(View view, int position);
      }
      
      GestureDetector mGestureDetector;
      
      public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
          mListener = listener;
          mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
              @Override
              public boolean onSingleTapUp(MotionEvent e) {
                  return true;
              }
      
              @Override
              public void onLongPress(MotionEvent e) {
                  View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                  if (child != null && mListener != null) {
                      mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                  }
              }
          });
      }
      
      @Override
      public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
          View childView = view.findChildViewUnder(e.getX(), e.getY());
          if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
              mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
              return true;
          }
          return false;
      }
      
      @Override
      public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
      }
      
      
      @Override
      public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
      }
      }
      

      现在像这样将lister添加到recyclerview

              indexRecyclerView.addOnItemTouchListener(
                  new RecyclerItemClickListener(MainActivity.this, indexRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
      
                      @Override
                      public void onItemClick(View view, int position) {
                         /// perform your action here
      
      
                      }
      
                      @Override
                      public void onLongItemClick(View view, int position) {
      
                      }
                  })
          );
      

      如有任何疑问,请咨询我

      【讨论】:

        【解决方案3】:

        试试这个:

        itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            int position = getLayoutPosition();
                            String id=ads.get(position).getId();
                            // call fragment
                        }
        }
        

        在 ViewHolder 构造函数中添加这个。

        【讨论】:

          【解决方案4】:

          您可以在 OnCkick 方法中添加Ad ad = ads.get(RecyclerAdapter.MyViewHolder.this.getAdapterPosition()); 以检索当前对象。然后使用接口将值传递给片段。

           @Override
                      public void onClick(View view) {
                          Toast.makeText(view.getContext(), "Clicked on Recycler View" , Toast.LENGTH_SHORT).show();
                          Ad ad = ads.get(RecyclerAdapter.MyViewHolder.this.getAdapterPosition());
                         //use interface to pass ad to the fragment....
                      }
          

          【讨论】:

            【解决方案5】:

            您的适配器类应如下所示。

            您必须从 ViewHolder 类中删除 onClickListener。并在onBindViewHolder方法中设置点击。

            public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{
            
                private List<Ad> ads;
                private Context context;
            
            
            
                public RecyclerAdapter(List<Ad> ads, Context context){
                    this.ads=ads;
                    this.context=context;
            
                }
            
            
                @Override
                public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    View view= LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.list_item_ads, parent,false);
                    return  new MyViewHolder(view);
                }
            
                @Override
                public void onBindViewHolder(MyViewHolder holder, int position) {
                    holder.name.setText(ads.get(position).getTitle());
                    holder.details.setText("Rs. " +ads.get(position).getPrice().toString()+ "/-");
            //        Glide.with(context).load(ads.get(position).getPhoto1()).into(holder.thumbnail);
                    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            /*Write your code here to send data to fragment*/
                            Ad ad = ads.get(position);
                        }
                    });
            
            
                }
            
                @Override
                public int getItemCount() {
                    return ads.size();
                }
            
            
            
            
                public static class MyViewHolder extends RecyclerView.ViewHolder{
            
                    ImageView thumbnail;
                    TextView name, details;
                    LinearLayout linearLayout;
                    public MyViewHolder(View itemView) {
                        super(itemView);
            //            thumbnail=(ImageView)itemView.findViewById(R.id.thumbnail);
                        name=(TextView)itemView.findViewById(R.id.title);
                        details=(TextView)itemView.findViewById(R.id.price);
                        linearLayout=(TextView)itemView.findViewById(R.id.linearLayout); // its your main layout
                    }
            
            
            
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-24
              • 2015-08-21
              • 2018-08-27
              • 2019-11-04
              • 2018-09-01
              • 2022-01-02
              相关资源
              最近更新 更多