首页 > 解决方案 > 片段recyclerView中的onClick监听器

问题描述


我是安卓新手。我正在尝试制作一个壁纸应用程序,为此我在选项卡布局的不同片段中显示不同类别的图像。我被困在适配器中。当我尝试将单击的图像从片段发送到新活动时,它崩溃了。但是,如果我评论“intent.putExtra”行,它会加载新的活动。请帮忙,我无法弄清楚是什么问题。

这是我的 WallpaperAdapter.java

public class WallpaperAdapter extends RecyclerView.Adapter<WallpaperViewHolder> {
private Fragment6 context;
private List<WallpaperModel> wallpaperModelList;
private OnImageItemClickListener imageItemClickListener;



public WallpaperAdapter(Fragment6 context, List<WallpaperModel> wallpaperModelList) {
    this.context = context;
    this.wallpaperModelList = wallpaperModelList;
}

@NonNull
@Override
public WallpaperViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.image_item,parent,false);
        WallpaperViewHolder wallpaperViewHolder= new WallpaperViewHolder(view);
        return new WallpaperViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull WallpaperViewHolder holder, int position) {
    Glide.with(context).load(wallpaperModelList.get(position).getMediumUrl()).into(holder.imageView);


}

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

public interface OnImageItemClickListener {
    public void onImageClicked(WallpaperModel wallpaperModel);
}

}

class WallpaperViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
View view;
ImageView imageView;
private List<WallpaperModel> wallpaperModelList;


public WallpaperViewHolder(@NonNull View itemView) {
    super(itemView);
    imageView = itemView.findViewById(R.id.itemImage);
    view=itemView.findViewById(R.id.imageItemLayout);

    view.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    int position = getAdapterPosition();
    Toast.makeText(v.getContext(), "Image Clicked", Toast.LENGTH_SHORT).show();
    Intent intent= new Intent(v.getContext(),Fullscreen.class);
    //intent.putExtra("original",wallpaperModelList.get(position).getOriginalUrl());
    v.getContext().startActivity(intent);


}

}

这是我的 Fragment6.java

public class Fragment6 extends Fragment implements WallpaperAdapter.OnImageItemClickListener{
RecyclerView recyclerView;
WallpaperAdapter wallpaperAdapter;
List<WallpaperModel> wallpaperModelList;

int pageNumber=1;
Boolean isScrolling= false;
int currentItem,totalItems,scrollOutItems;



String natureUrl="URL";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view= inflater.inflate(R.layout.fragment_6, container, false);
    recyclerView=view.findViewById(R.id.recyclerView);

    wallpaperModelList= new ArrayList<>();
    wallpaperAdapter = new WallpaperAdapter(this,wallpaperModelList);

    recyclerView.setAdapter(wallpaperAdapter);

    GridLayoutManager gridLayoutManager= new GridLayoutManager(getContext(),2);
    recyclerView.setLayoutManager(gridLayoutManager);

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
                isScrolling= true;
            }
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            currentItem = gridLayoutManager.getChildCount();
            totalItems = gridLayoutManager.getItemCount();
            scrollOutItems = gridLayoutManager.findFirstVisibleItemPosition();

            if(isScrolling && (currentItem+scrollOutItems==totalItems)){
                isScrolling = false;
                fetchWallpaper();
            }
        }
    });
    fetchWallpaper();

    return view;
}

 private void fetchWallpaper() {



    StringRequest request= new StringRequest(Request.Method.GET, natureUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //On response
            try {
                JSONObject jsonObject= new JSONObject(response);

                JSONArray jsonArray= jsonObject.getJSONArray("photos");

                int length=jsonArray.length();
                for(int i= 0;i<length;i++)
                {
                    JSONObject object= jsonArray.getJSONObject(i);
                    int id=object.getInt("id");
                    JSONObject objectImages = object.getJSONObject("src");
                    String originalUrl= objectImages.getString("original");
                    String mediumUrl= objectImages.getString("medium");

                    WallpaperModel wallpaperModel= new WallpaperModel(id,originalUrl,mediumUrl);
                    wallpaperModelList.add(wallpaperModel);


                }

                wallpaperAdapter.notifyDataSetChanged();
                pageNumber++;

            }catch (JSONException e){

            }

        }}, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //On error response

        }}){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String,String> params = new HashMap<>();
            params.put("Authorization","key");


            return params;

        }
    };

    RequestQueue requestQueue= Volley.newRequestQueue(getContext());
    requestQueue.add(request);
}

@Override
public void onImageClicked(WallpaperModel wallpaperModel) {


}

}

标签: androidandroid-fragmentsandroid-recyclerview

解决方案


你能显示你得到什么错误吗?

最好不要直接在视图持有者中处理点击事件,因为除了在项目点击后打开活动之外,您可能需要做其他事情,还有另一种具体的方法可以实现相同的目的。即通过使用接口。

我可以看到您已经创建了点击接口但没有使用它。问题是您已经创建了 OnImageItemClickListener 接口并在片段中实现了它,但是您没有在任何地方调用该接口,您确实创建了点击侦听器接口为适配器中的参数,但您没有将接口的实例传递给适配器,也没有将其传递给它的视图持有者。因为您必须从视图持有者调用它才能在片段中调用它。

请按照以下步骤实现此目的。

  1. 您必须将项目单击接口的实例传递给适配器,然后从适配器传递给它的视图持有者。

将现有的适配器创建行编辑为此

wallpaperAdapter = new WallpaperAdapter(this,wallpaperModelList,this);
  1. 现在,在视图持有者中按钮的单击侦听器上,您必须使用该接口实例来调用该接口的项目单击功能。当您通过界面将视图持有者的任何数据传递给您的活动时。

  2. 同时,在活动或片段中,您将通过实现的接口处理项目点击,即 onImageClicked(),当您从视图持有者调用它时,将调用该接口。

     @Override
     public void onImageClicked(WallpaperModel wallpaperModel)
     {
      //start the activity from here.
     }
    

推荐阅读