首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在片段中的回收器视图项目上设置onClicklistener

如何在片段中的回收器视图项目上设置onClicklistener
EN

Stack Overflow用户
提问于 2018-08-11 21:50:17
回答 3查看 2.4K关注 0票数 -1

我在一个项目上工作,这需要使用回收器视图显示列表项目。此外,每个项目都必须在单击事件上执行。这就是我所做的。

片段:

代码语言:javascript
复制
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.stutee.bakingapp.utils.NetworkUtils;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.net.URL;

import butterknife.BindView;
import butterknife.ButterKnife;

public class RecipeListFragment extends Fragment implements    LoaderManager.LoaderCallbacks<String> {

    private static final int LOADER_ID = 10;

    @BindView(R.id.rv_recipe_list) RecyclerView mRecyclerView;
    public RecipeAdapter mAdapter;
    String[] parsedRecipeName;

    public RecipeListFragment() { }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable  ViewGroup container, @Nullable Bundle savedInstanceState) {

        final View rootView = inflater.inflate(R.layout.fragment_recipe_list, container, false);
    ButterKnife.bind(this,rootView);

        mAdapter = new RecipeAdapter(getContext());

        int spanCount = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2;

        GridLayoutManager layoutManager

                = new GridLayoutManager(getContext(),spanCount);



        mRecyclerView.setLayoutManager(layoutManager);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setAdapter(mAdapter);

        Bundle bundleForLoader = new Bundle();

        getLoaderManager().initLoader(LOADER_ID, bundleForLoader,this);


        return rootView;
    }

@NonNull
@Override
public Loader<String> onCreateLoader(int id, @Nullable Bundle args) {
    return new AsyncTaskLoader<String>(getContext()) {

        String mRecipeJsonResult;

        @Override
        protected void onStartLoading() {
            if (mRecipeJsonResult != null) {
                deliverResult(mRecipeJsonResult);
            } else {

                forceLoad();
            }

        }



        @Override

        public String loadInBackground() {

            String s = "https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json";
            URL recipeRequestUrl = NetworkUtils.buildUrl(s);

            try {

                String jsonRecipeResponse = NetworkUtils
                        .getResponseFromHttpUrl(recipeRequestUrl);

                return jsonRecipeResponse;
            } catch (Exception e) {

                e.printStackTrace();

                return null;
            }

        }

        public void deliverResult(String data) {

            mRecipeJsonResult = data;
            super.deliverResult(data);
        }

    };

}

@Override
public void onLoadFinished(@NonNull Loader<String> loader, String data) {

    final String SHOW_NAME = "name";

    try {

        JSONArray jsonArray = new JSONArray(data);

        parsedRecipeName = new String[jsonArray.length()];

        for (int i = 0; i < jsonArray.length(); i++) {

            JSONObject jsonObject = jsonArray.getJSONObject(i);

            String recipeNameString = jsonObject.getString(SHOW_NAME);

            parsedRecipeName[i] = recipeNameString;
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    mAdapter.setRecipeName(parsedRecipeName);

}

@Override
public void onLoaderReset(@NonNull Loader<String> loader) {

}

}

适配器:

代码语言:javascript
复制
package com.example.stutee.bakingapp;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.ButterKnife;

public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.RecipeAdapterViewHolder> {

private String[] mRecipeName;

public interface RecipeAdapterOnClickHandler{
    void onClick(String name);
}

public RecipeAdapterOnClickHandler mClickHandler;

public RecipeAdapter(RecipeAdapterOnClickHandler clickHandler){
    mClickHandler = clickHandler;
}

@NonNull
@Override
public RecipeAdapter.RecipeAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    int layoutIdForListItem = R.layout.recipe_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view = inflater.inflate(layoutIdForListItem, parent, shouldAttachToParentImmediately);
    return new RecipeAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecipeAdapter.RecipeAdapterViewHolder holder, int position) {

    String currentRecipeName = mRecipeName[position];
    //Log.v(TAG, "poster path: " + currentPosterPath);
    holder.recipeNameTv.setText(currentRecipeName);
    }

@Override
public int getItemCount() {
    if (null == mRecipeName) return 0;
    return mRecipeName.length;
}

public class RecipeAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    @BindView(R.id.tv_recipe_name) TextView recipeNameTv;

    public RecipeAdapterViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int adapterPosition = getAdapterPosition();
        String title = mRecipeName[adapterPosition];
        mClickHandler.onClick(title);
    }
}

public void setRecipeName(String[] recipeName) {
    mRecipeName = recipeName;
    notifyDataSetChanged();
}

}

我在适配器中制作了一个接口来处理onClickListener,并在MainActivity中实现了它,fragment的主机活动。但它不起作用。

EN

回答 3

Stack Overflow用户

发布于 2018-08-12 00:33:56

适配器外部的onItemClickListener。首先你需要创建这个类:

代码语言:javascript
复制
public class  RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
public interface OnItemClickListener {
    void onItemClick(View view, int position);
    void onItemLongClick(View view, int position);
}

private OnItemClickListener mListener;
private 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 childView = recyclerView.findChildViewUnder(e.getX(), e.getY());

            if (childView != null && mListener != null) {
                mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
            }
        }
    });
}

@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 false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

}

然后,您必须像这样实现它

代码语言:javascript
复制
        recyclerViewClasses.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), recyclerViewClasses, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {

                RoundedImageView iv_student = view.findViewById(R.id.iv_student);
                TextView textView = view.findViewById(R.id.tv_title);
                textView.setOnClickListener(view1 -> {

                });

                iv_student.setOnClickListener(v -> {

                });
            }

        @Override
        public void onItemLongClick(View view, int position) {

        }
    }));
票数 1
EN

Stack Overflow用户

发布于 2018-08-11 22:23:11

在"R.layout.recipe_list_item“中为布局项目提供一个id。然后在RecipeAdapterViewHolder中绑定这个id。因此,在onBindViewHolder中设置listener。示例持有者。(Your_id_name).setOnClickListener

票数 0
EN

Stack Overflow用户

发布于 2018-08-12 00:27:21

在onBindViewHolder中定义onClick不是一种好的做法

正确的方法是在适配器类中声明一个接口,并在活动上实现它,使用接口我们可以传递值

步骤1: OnItemClickListener接口的Decalre侦听器

第二步:声明一个接口,这个接口将把我们点击和数据从适配器转发到我们的活动

然后,Step3在您的片段中定义此接口。full info https://github.com/Eldhopj/recyclerCardViewSample的检查代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51800286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档