简体   繁体   English

在recyclerview中设置onclicklistener

[英]Set onclicklistener in recyclerview

My adaptor class: 我的适配器类:

public class Adaptor extends RecyclerView.Adapter<Adaptor.Holder>{

private ArrayList<Winkel> winkels;
private LayoutInflater inflater;
private ImageView icon;
private ItemCLickCallback itemCLickCallback;

public interface ItemCLickCallback {
    void onItemClick(int p);
    void onSecItemClick(int p);

}

public void setItemCLickCallback(final ItemCLickCallback itemCLickCallback1){
    ;this.itemCLickCallback = itemCLickCallback;
}

public Adaptor (ArrayList<Winkel> winkels,Context c){
    this.inflater = LayoutInflater.from(c);
    this.winkels = winkels;
}


@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.list_item,parent,false);
    return new Holder(view);
}

@Override
public void onBindViewHolder(Holder holder, int position) {
    Winkel winkel = winkels.get(position);
    holder.title.setText(winkel.getNaam());
    if (winkel.isFavourtite()){
        holder.icon.setImageResource(R.drawable.ic_star_black_18dp);
    }
    else{
        holder.icon.setImageResource(R.drawable.ic_star_border_black_18dp);
    }

}

@Override
public int getItemCount() {

    return winkels.size();
}

class Holder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private TextView title;
    private View container;
    private ImageView icon;

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

        title = (TextView)itemView.findViewById(R.id.lbl_item_text);
        container = itemView.findViewById(R.id.cont_item_root);
        icon = (ImageView) itemView.findViewById(R.id.im_item_icon_secondary);
        icon.setOnClickListener(this);
        container.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.cont_item_root){
            itemCLickCallback.onItemClick(getAdapterPosition());

        }
        else{
            itemCLickCallback.onSecItemClick(getAdapterPosition());
        }
    }
}
}


    @Override
    public void onClick(View v) {

    }
}
}

Code where it gets implemented (my issue is here at adaptor.setItemClickCallback(context) 实现它的代码(我的问题在这里Adaptor.setItemClickCallback(context)

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    Adaptor adaptor = new Adaptor(winkels,context);
    recyclerview.setLayoutManager(new LinearLayoutManager(context));
    recyclerview.addItemDecoration(new VerticalSpace(30));
    recyclerview.setAdapter(adaptor);
    adaptor.setItemCLickCallback(context);

}

Called from fragment overview: 从片段概述调用:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycle);
    ODKortrijkWebservice webs = new ODKortrijkWebservice(this.getActivity(),mRecyclerView);
    webs.execute();
    return view;
 }

How do I set the context for ItemCLickCallback(this)? 如何设置ItemCLickCallback(this)的上下文? It should be context (at least I think so?) because that's what gets passed from the fragment but I can't seem to figure out how to get this to work, so some help would be appreciated. 它应该是上下文(至少我是这样认为的),因为这是片段传递的内容,但是我似乎无法弄清楚如何使它起作用,因此,将不胜感激。 Basically I want to add onclicklisteners for every item in my recyclerview, and the recyclerview is created by using data from a webservice, hence why the adaptor class is called from the class where I get the data from the web service, which gets excecuted in my fragment. 基本上,我想为recyclerview中的每个项目添加onclicklisteners,并且recyclerview是通过使用来自Web服务的数据创建的,因此为什么要从从Web服务获取数据的类中调用适配器类,而该类在我的产品中被执行分段。 Thank you. 谢谢。

I recommend you to make ODKortrijkWebservice.Callback like following. 我建议您像下面这样制作ODKortrijkWebservice.Callback

In your ODKortrijkWebservice: 在您的ODKortrijkWebservice中:

public class ODKortrijkWebservice extends AsyncTask<...> {

    private Callback mCallback;

    public interface Callback {
        void onSuccess(ArrayList<Winkel> winkels);
    }

    public ODKortrijkWebservice(Context context, Callback callback) {
        ...
        mCallback = callback;
        ...
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        ...
        mCallback.onSuccess(winkels);
    }
}

In your Fragment: 在您的片段中:

public class YourFragment extends Fragment implements ODKortrijkWebservice.Callback, Adaptor.ItemCLickCallback {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_overview, container, false);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycle);
        ODKortrijkWebservice webs = new ODKortrijkWebservice(this.getActivity(), this);
        webs.execute();

        return view;
    }

    @Override
    public void onSuccess(ArrayList<Winkel> winkels) {
        Adaptor adaptor = new Adaptor(winkels, getContext());
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.addItemDecoration(new VerticalSpace(30));
        mRecyclerView.setAdapter(adaptor);
        adaptor.setItemCLickCallback(this);
    }

    @Override
    public void onItemClick(int p) {

    }

    @Override
    public void onSecItemClick(int p) {

    }
}

Here, You need to create one interface at RecycleView.Adapter<> 在这里,您需要在RecycleView.Adapter <>中创建一个接口。

  private static OnItemClickListener listener;
    // Define the listener interface
    public interface OnItemClickListener {
        void onItemClick(View itemView, int position);
    }
    // Define the method that allows the parent activity or fragment to define the listener
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

send require details with interface method 使用接口方法发送需要的详细信息

 public class ViewHolder extends RecyclerView.ViewHolder{

        TextView header_title;

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

            txt_country_name = (TextView)itemView.findViewById(R.id.header_title);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Triggers click upwards to the adapter on click
                    if (listener != null)
                        listener.onItemClick(itemView, getLayoutPosition());
                }
            });
        }

    }

call adapter listener 呼叫适配器监听器

ListAdapter listAdapter;

listAdapter.setOnItemClickListener(new listAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
            Toast.makeText(getActivity(), position+ " was clicked!", Toast.LENGTH_SHORT).show();

            }
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM