android - 该接口(interface)不适用于 fragment

标签 android android-fragments

我有一个用于 2 个列表的“通用”适配器,一个用于卖家名称,另一个用于产品名称,当单击列表中的任何项目时,我在 onClick 方法中正确接收到位置,但是当我想要通过 listener.onClickPosition 方法发送永远不会到达 fragment 。也就是说,如果 fragment 没有实现接口(interface)。

请注意,我的 fragment 在 viewpager 中,我不知道它是否会影响任何内容

我的适配器

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);
}
}

我的 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");
        }
    }
}
}

最佳答案

我不使用界面的临时解决方案

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


@Override
    public void onClick(View v) {
        if(context instanceof ListSellerActivity) {
       ((ListSellerActivity)context).itemPosition(getAdapterPosition());
        }}
  1. 在 Activity 中创建一个方法
  2. 调用Adapter中的onClick函数方法

关于android - 该接口(interface)不适用于 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44245055/

相关文章:

java - Android 包名称必须以 "com."开头?

android - 如何在抽屉导航的右上角添加十字按钮

android - 另一个 fragment 问题的 fragment

java - android fragment 接口(interface)nullpointerexception

java - 非法状态异常 : Fragment null must be a public static class to be properly recreated from instance state

php - (70007)指定的超时已过期 : mod_fcgid: can't get data from http client

java - 如何显示 firebase 数据库中的所有标记?

android - 从sdcard复制镜像到android项目包

java - Pubnub V4 迁移回调

android - fragment 中的上下文操作模式未显示