接口值始终为null

时间:2016-04-25 06:37:58

标签: java android android-fragments interface android-recyclerview

我正在使用自定义回收器视图,在适配器类中,我已经实现了接口,在按钮单击时该接口始终为null。这是我的适配器类。

public class FeedListAdapter extends
    RecyclerView.Adapter<AddtoCartHolder> {

 private OnFeedItemClickListener onFeedItemClickListener;
 public FeedListAdapter(Activity activity, ArrayList<CartItem> feedItems) {
    this.activity = activity;
    this.feedItems = feedItems;
    this.filteredfeedItems = feedItems;

    inflater = LayoutInflater.from(activity);
}

 public void setOnFeedItemClickListener(OnFeedItemClickListener onFeedItemClickListener) {
        this.onFeedItemClickListener = onFeedItemClickListener;
    }

@Override
public AddtoCartHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(
            R.layout.feed_item, parent, false);
    AddtoCartHolder viewHolder = new AddtoCartHolder(v);
     setupClickableViews(v, viewHolder);
    return viewHolder;
}
@Override
public void onBindViewHolder(final AddtoCartHolder holder, int position) {

    CartItem item = (CartItem) filteredfeedItems.get(position);
    holder.price.setText((String.valueOf(item.getProductName()) + ""));
    holder.location.setText((String.valueOf(item.getQuantity())) + "");


}

private void setupClickableViews(final View view, final AddtoCartHolder cellFeedViewHolder) {
     cellFeedViewHolder.plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(onFeedItemClickListener !=null){
                onFeedItemClickListener.onAddClick(v, cellFeedViewHolder.getAdapterPosition());
                }
                else{
                    Toast.makeText(activity, "Data is null", Toast.LENGTH_LONG).show();
                }
            }
        });
}

 public interface OnFeedItemClickListener {
        void onAddClick(View v, int position);

    }

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

每当点击按钮时,我总是变为null,知道为什么它会变为空...

这是我的片段类,它实现了接口。

public class MyFragment extends Fragment implements FeedListAdapter.OnFeedItemClickListener{

// the method
@Override
public void onAddClick(View v, int position) {
    // TODO Auto-generated method stub
    Snackbar.make(clContent, "Product removed from cart!",
            Snackbar.LENGTH_SHORT).show();
}

2 个答案:

答案 0 :(得分:1)

您必须在片段正确的伙伴中实例化FeedListAdapter ???

喜欢使用声明:

FeedListAdapter adapter = new FeedListAdapter(this.getActivity(),your_array_list)

实例化适配器后,只需调用适配器的setOnFeedItemClickListener并将'this'作为参数:)全部:)

adapter.setOnFeedItemClickListener(this)

希望我的回答能帮助你:)快乐的编码伙伴:)

答案 1 :(得分:1)

根据事物的外观,你不能设置你的听众。因此,onFeedItemClickListener始终为null

另外MyFragment实际上并没有做任何事情,你还没有夸大视图,覆盖onCreateView(...)等等。

有一些事情你肯定可以改变以改善你的实施。但要让你的听众工作:

  1. 只是摆脱MyFragment你似乎没有正确使用它。
  2. implements FeedListAdapter.OnFeedItemClickListener移至Activity。即,让您的活动实施OnFeedItemClickListener界面,而不是MyFragment(似乎没有做任何事情)。
  3. FeedListAdapter在其构造函数中设置侦听器:

    public FeedListAdapter(Activity activity, ArrayList<CartItem> feedItems)
    {
        this.activity = activity;
        // Assume we the activity implements OnFeedItemClickListener
        setOnFeedItemClickListener((OnFeedItemClickListener)activity);
        this.feedItems = feedItems;
        this.filteredfeedItems = feedItems;
        inflater = LayoutInflater.from(activity);
    }
    
  4. 请记住,这是一个非常糟糕的实现,你绝对可以改进它,但就问题而言,它已经足够了。