Java 侦听器在自定义视图类中始终为空

Java 侦听器在自定义视图类中始终为空,java,android,android-activity,android-recyclerview,android-view,Java,Android,Android Activity,Android Recyclerview,Android View,我有这样的结构: 活动->回收视图适配器->自定义视图 这是我的代码(为了清楚起见,省略了一些部分) 我的活动,MainActivity.java: public class MainActivity extends AppCompatActivity { private final String TAG = "MainActivity"; private EditText textField; @Override protected void onCrea

我有这样的结构:

活动->回收视图适配器->自定义视图

这是我的代码(为了清楚起见,省略了一些部分)

我的活动,
MainActivity.java

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    private EditText textField;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        if (toolbar != null) {
            setSupportActionBar(toolbar);
        }

        textField = (EditText) findViewById(R.id.textField);

        // Adapter code
    }
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private static final String TAG = "MyAdapter";

    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View v) {
            super(v);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);

        CustomView customView = new CustomView(context);

        customView.setCustomViewListener(new CustomView.CustomViewListener() {
            @Override
            public void onEventComplete() {
                Log.d(TAG, "EVENT COMPLETE");
            }
        });

        ViewHolder viewHolder = new ViewHolder(customView);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        //
    }

    // other methods

}
public class CustomView extends RelativeLayout {

    private final String TAG = "CustomView";

    private CustomViewListener mListener = null;

    private RelativeLayout mLayout;
    private ImageView mPicture;

    public CustomView(Context context) {
        super(context);
        init();
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public interface CustomViewListener {
        void onEventComplete();
    }

    public void setCustomViewListener(CustomViewListener listener) {
        this.mListener = listener;
    }

    private void init() {
        inflate(getContext(), R.layout.item_layout, this);

        this.mLayout = (RelativeLayout) findViewById(R.id.layout);
        this.mPicture = (ImageView) findViewById(R.id.picture);

        mPicture.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.onEventComplete();
                }
            }
        });
    }

}
我的适配器,
MyAdapter.java

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    private EditText textField;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        if (toolbar != null) {
            setSupportActionBar(toolbar);
        }

        textField = (EditText) findViewById(R.id.textField);

        // Adapter code
    }
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private static final String TAG = "MyAdapter";

    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View v) {
            super(v);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);

        CustomView customView = new CustomView(context);

        customView.setCustomViewListener(new CustomView.CustomViewListener() {
            @Override
            public void onEventComplete() {
                Log.d(TAG, "EVENT COMPLETE");
            }
        });

        ViewHolder viewHolder = new ViewHolder(customView);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        //
    }

    // other methods

}
public class CustomView extends RelativeLayout {

    private final String TAG = "CustomView";

    private CustomViewListener mListener = null;

    private RelativeLayout mLayout;
    private ImageView mPicture;

    public CustomView(Context context) {
        super(context);
        init();
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public interface CustomViewListener {
        void onEventComplete();
    }

    public void setCustomViewListener(CustomViewListener listener) {
        this.mListener = listener;
    }

    private void init() {
        inflate(getContext(), R.layout.item_layout, this);

        this.mLayout = (RelativeLayout) findViewById(R.id.layout);
        this.mPicture = (ImageView) findViewById(R.id.picture);

        mPicture.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.onEventComplete();
                }
            }
        });
    }

}
但由于某些原因,侦听器总是
null
,因此从未实际调用
onEventComplete()


为什么它总是空的?

我认为您的自定义视图应该如下所示,我不确定。但你可以试试下面的方法

private void init() {
View view=inflate(R.layout.item_layout, null);
this.mLayout = (RelativeLayout)view. findViewById(R.id.layout);
this.mPicture = (ImageView)view. findViewById(R.id.picture);
this.mPicture.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        if (mListener != null) {
             mListener.onEventComplete();
        }
      }
    });
  addView(view);
}
更新

将自定义视图创建为名为customview的xml文件,然后重试

R.layout.customview

<com.yourpackage.customview
   layout_height="match_parent"
   layout_width="match_parent"/>

我想你的自定义视图应该如下所示,我不确定。但你可以试试下面的方法

private void init() {
View view=inflate(R.layout.item_layout, null);
this.mLayout = (RelativeLayout)view. findViewById(R.id.layout);
this.mPicture = (ImageView)view. findViewById(R.id.picture);
this.mPicture.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        if (mListener != null) {
             mListener.onEventComplete();
        }
      }
    });
  addView(view);
}
更新

将自定义视图创建为名为customview的xml文件,然后重试

R.layout.customview

<com.yourpackage.customview
   layout_height="match_parent"
   layout_width="match_parent"/>

这没有改变任何事情/这没有改变任何事情/再试试我的