pete
pete

Reputation: 365

The interface does not work on the fragment

I have a "generic" adapter for 2 lists, one for the sellers name and another for the name of the products, when clicking on any item in the list I correctly receive the position in the onClick method, however when I want to send by The listener.onClickPosition method never reaches the fragment. ie it is as, if the fragment does not implement the interface.

Note my fragment is inside a viewpager I do not know if it influences anything

My Adapter

public class AdapterRecyclerView extends 
RecyclerView.Adapter<AdapterRecyclerView.AdapterRecyclerViewViewHolder>{
private static  Context context;
private List items;
private String type;
private static OnClickAdapterRecyclerView listener;


public AdapterRecyclerView(List items, Fragment fragment,String type) {
    this.items = items;
    this.type =type;
    listener = (OnClickAdapterRecyclerView) fragment;
}


@Override
public AdapterRecyclerViewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=null;
    context=parent.getContext();
    switch (type){
        case SELLER:{
           view = LayoutInflater.from(parent.getContext()).inflate(R.layout.seller_card, parent, false);
            break;
        }
        case PRODUCTS:{
        ...
        }

    }
    AdapterRecyclerViewViewHolder adapter = new AdapterRecyclerViewViewHolder(view);
    return adapter;
}

@Override
public void onBindViewHolder(AdapterRecyclerViewViewHolder holder, int position) {

    switch (type){
        case SELLER:{
            Seller seller = (Seller) items.get(position);
            holder.binItem(seller);
            break;
        }
        case PRODUCTS:{
         ...
        }
    }
}

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

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

    public TextView textViewNameProduct;
    public TextView textViewNameSeller;


    public AdapterRecyclerViewViewHolder(View v) {
        super(v);
        v.setOnClickListener(this);
        switch (v.getId()){
            case R.id.seller_card:{
                textViewNameSeller = (TextView) v.findViewById(R.id.textViewNameSeller);
                break;
            }
            case R.id.products_card:{
            ...
            }

        }

    }

    public void binItem(Seller seller){
      textViewNameSeller.setText(product.getName());
    }

    public void binItem(Product product){
    ...
    }

    @Override
    public void onClick(View v) {
        //The position is printed correctly
        Log.d("Position",getAdapterPosition()+"");
        //Here this call does not work
        listener.onClickPosition(getAdapterPosition());
    }
}

public interface OnClickAdapterRecyclerView{
    void onClickPosition(int pos);
}
}

My Fragment

public class SellerListFragment extends Fragment implements AdapterRecyclerView.OnClickAdapterRecyclerView {


public static final String SELLER="SELLER";


@BindView(R.id.recyclerViewSeller)
protected RecyclerView recyclerView;

private ArrayList<Seller>sellers;

private AdapterRecyclerView adapterSeller;

private OnSelectedSellerListener listener;

public SellerListFragment () {

}

public static SellerListFragment newInstance() {
    SellerListFragment fragment = new SellerListFragment();
    Bundle bundle = new Bundle();
    fragment.setArguments(bundle);
    return fragment;
}


@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sellers = new ArrayList<>();
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view =inflater.inflate(R.layout.fragment_seller_list, container, false);
    ButterKnife.bind(this, view);
    return view;
}



@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    adapterSeller = new AdapterRecyclerView(sellers,SellerListFragment.this,SELLER);
    recyclerView.setAdapter(adapterSeller);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));

}


@Override
public void onClickPosition(int pos) {
 //Never called does not work
    listener.onSelectedSellerListener(pos,sellers);
}


public interface OnSelectedSellerListener {

    void onSelectedSellerListener(int position, ArrayList<Seller> seller);
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Activity activity;
    if (context instanceof Activity) {
        activity = (Activity) context;
        try {
            listener = (OnSelectedSellerListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + "implement OnSelectedSellerListener");
        }
    }
}
}

Upvotes: 1

Views: 113

Answers (1)

pete
pete

Reputation: 365

My temporary solution without using the interface

 public void itemPosition(int position) {
    Log.d("Position",position+"");
}


@Override
    public void onClick(View v) {
        if(context instanceof ListSellerActivity) {
       ((ListSellerActivity)context).itemPosition(getAdapterPosition());
        }}
  1. Create a method in the activity
  2. Call the method onClick function in Adapter

Upvotes: 2

Related Questions