Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 构建自定义组件-添加侦听器时膨胀时崩溃_Android - Fatal编程技术网

Android 构建自定义组件-添加侦听器时膨胀时崩溃

Android 构建自定义组件-添加侦听器时膨胀时崩溃,android,Android,我正在尝试将侦听器添加到我添加到应用程序的自定义组件(水平数字选择器)。此自定义组件是在回收视图中使用的行布局的一部分。当应用程序试图在RecyclerView适配器的onCreateViewHolder()中膨胀布局时,我遇到一个异常 对类talkie.feedback.NumberPickerHorizontal进行充气时出错 但是,如果我对引用变量mCallback(在自定义组件的代码中)的所有行进行注释,则应用程序不会崩溃 这是我的密码: 自定义组件 public class Numbe

我正在尝试将侦听器添加到我添加到应用程序的自定义组件(水平数字选择器)。此自定义组件是在回收视图中使用的
行布局的一部分。当应用程序试图在
RecyclerView
适配器的
onCreateViewHolder()
中膨胀布局时,我遇到一个异常

对类talkie.feedback.NumberPickerHorizontal进行充气时出错

但是,如果我对引用变量
mCallback
(在自定义组件的代码中)的所有行进行注释,则应用程序不会崩溃

这是我的密码:

自定义组件

public class NumberPickerHorizontal extends LinearLayout
{
private OnNumberChangedListener listener;

public interface OnNumberChangedListener {
    void onNumberChanged(int value);
}

public void setOnNumberChangedListener(OnNumberChangedListener listener){
    this.listener = listener;
}

public NumberPickerHorizontal(Context context, AttributeSet attrs) {
    super(context, attrs);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (MyCustomObjectListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString()
                + " must implement MyCustomObjectListener");
    }

    LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rootView = layoutInflater.inflate(R.layout.number_picker_horizontal, this);

    Button btn_plus = (Button) rootView.findViewById(R.id.btn_plus);
    Button btn_minus = (Button) rootView.findViewById(R.id.btn_minus);
    final EditText edit_text = (EditText) rootView.findViewById(R.id.edit_text);

    final int nStart = 0, nEnd = 100;

    btn_minus.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            int current = MySingleton.val(edit_text.getText().toString());
            if (current > nStart) {
                current -= 5;
                String s = "" + current;
                edit_text.setText(s);
                listener.onNumberChanged(current);
            }
        }
    });

    btn_minus.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() {
        @Override
        public void onClick(View view) {
            // the code to execute repeatedly
            int current = MySingleton.val(edit_text.getText().toString());
            if (current > nStart) {
                current -= 5;
                String s = "" + current;
                edit_text.setText(s);
                listener.onNumberChanged(current);
            }
        }
    }));

    btn_plus.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            int current = MySingleton.val(edit_text.getText().toString());
            if (current < nEnd) {
                current += 5;
                String s = "" + current;
                edit_text.setText(s);
                listener.onNumberChanged(current);
            }
        }
    });

    btn_plus.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() {
        @Override
        public void onClick(View view) {
        // the code to execute repeatedly
            int current = MySingleton.val(edit_text.getText().toString());
            if (current < nEnd) {
                current += 5;
                String s = "" + current;
                edit_text.setText(s);
                listener.onNumberChanged(current);
            }
        }
    }));
}
}
公共类编号pickerhorizontal扩展线性布局
{
私有OnNumberChangedListener侦听器;
NumberChangedListener上的公共接口{
无效onNumberChanged(int值);
}
公共无效设置OnNumberChangedListener(OnNumberChangedListener侦听器){
this.listener=listener;
}
public NumberPickerHorizontal(上下文、属性集属性){
超级(上下文,attrs);
//这确保容器活动已实现
//回调接口。如果不是,则抛出异常
试一试{
mCallback=(MyCustomObjectListener)上下文;
}catch(ClassCastException e){
抛出新的ClassCastException(context.toString()
+“必须实现MyCustomObjectListener”);
}
LayoutInflater LayoutInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
视图根视图=布局平坦。充气(R.layout.number\u picker\u horizontal,this);
按钮btn\u plus=(按钮)rootView.findviewbyd(R.id.btn\u plus);
按钮btn_减号=(按钮)rootView.findviewbyd(R.id.btn_减号);
final EditText edit_text=(EditText)rootView.findViewById(R.id.edit_text);
最终int nStart=0,nEnd=100;
btn_减去.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
int current=MySingleton.val(编辑_text.getText().toString());
如果(当前>开始){
电流-=5;
字符串s=”“+当前值;
编辑_text.setText;
listener.onNumberChanged(当前);
}
}
});
btn_减去.setOnTouchListener(新的RepeatListener(400100,新的OnClickListener)(){
@凌驾
公共void onClick(视图){
//要重复执行的代码
int current=MySingleton.val(编辑_text.getText().toString());
如果(当前>开始){
电流-=5;
字符串s=”“+当前值;
编辑_text.setText;
listener.onNumberChanged(当前);
}
}
}));
btn_plus.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
int current=MySingleton.val(编辑_text.getText().toString());
如果(电流
适配器

public class Recycler_View_Adapter extends   RecyclerView.Adapter <Recycler_View_Adapter.ViewHolder>implements
    NumberPickerHorizontal.MyCustomObjectListener
{

private final ArrayList<SettingsClass> usersArrayList;
List<SettingsClass> usersList = null;
private final int LayoutDetail;
Context context;
private final OnItemClickListener listener;

public interface OnItemClickListener {
    void onItemClick(int position);
}

public Recycler_View_Adapter(List<SettingsClass> UsersList, Context context, int layoutDetail,
                             OnItemClickListener listener) {
    this.context = context;
    this.listener = listener;

    LayoutDetail = (layoutDetail == 0 ? R.layout.row_layout_simple :layoutDetail);

    usersList = UsersList;
    usersArrayList = new ArrayList<>();
    usersArrayList.addAll(usersList);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //Inflate the layout, initialize the View Holder
    View v = LayoutInflater.from(parent.getContext()).inflate(LayoutDetail, parent, false);
    return new ViewHolder(v);
}

@Override public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(position, usersList.get(position), listener);
}

@Override
public int getItemCount() {
    //returns the number of elements the RecyclerView will display
    return usersList.size();
}

public void onNumberChanged(int value) {
    MySingleton.doMyToast(context, "the new value is=" + value);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}
public SettingsClass getItem(int position) {
    return usersList.get(position);
}

// Filter Class
public void filterA(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    MySingleton.printMyLog(2, "in Recycler_View_Adapter.Filter start {" + charText + "}");
    usersList.clear();
    if (charText.length() == 0) {
        usersList.addAll(usersArrayList);
    }
    else
    {
        for (SettingsClass wp : usersArrayList)
        {
            MySingleton.printMyLog(3,"in Recycler_View_Adapter.Filter  {" + wp.name + "} [" + wp.name.toLowerCase(Locale.getDefault()).contains(charText) + "]");
            if (wp.name.toLowerCase(Locale.getDefault()).contains(charText))
                usersList.add(wp);
        }
    }
    notifyDataSetChanged();
}

static class ViewHolder extends RecyclerView.ViewHolder
{
    CardView cv;
    TextView description, rating, explanation;
    ImageView imageView;
    NumberPickerHorizontal numberPicker;


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

        cv = (CardView) itemView.findViewById(R.id.cardView);
        description = (TextView) itemView.findViewById(R.id.description);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);
        rating = (TextView) itemView.findViewById(R.id.rating);
        explanation = (TextView) itemView.findViewById(R.id.explanation);

        numberPicker = (NumberPickerHorizontal) itemView.findViewById(R.id.horizontal_number_picker);
    }

    public void bind(final int position, final SettingsClass user, final OnItemClickListener listener) {
        if (numberPicker != null)
           numberPicker.setOnNumberChangedListener(new NumberPickerHorizontal.OnNumberChangedListener() {
                        public void onNumberChanged(int value) {
                            MySingleton.printMyLog(1, "the new value is=" + value + "pos" + position);
                        }
                    });

        if (description != null && !MySingleton.empty(user.name))
            description.setText(user.name);

        if (rating != null && user.id > 0)
            rating.setText(String.format("%.2f", (float) (user.id / 20.0f)));

        if (imageView != null)
            MySingleton.displayPicture(user.iconFileName, imageView);

        if (explanation != null && !MySingleton.empty(user.categoryCode))
            explanation.setText(user.categoryCode);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(position);
            }
        });
    }
}
}
公共类回收器\u视图\u适配器扩展了回收器视图。适配器实现
NumberPickerHorizontal.MyCustomObjectListener
{
私有最终数组列表用户数组列表;
List usersList=null;
私人最终内部布局详图;
语境;
私人终场监听者;
公共接口侦听器{
无效单击(内部位置);
}
公共回收器\u视图\u适配器(列表用户列表、上下文上下文、int布局详细信息、,
(监听器){
this.context=上下文;
this.listener=listener;
LayoutDetail=(LayoutDetail==0?R.layout.row\u布局\u简单:LayoutDetail);
usersList=usersList;
usersArrayList=newarraylist();
usersArrayList.addAll(usersList);
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
//充气布局,初始化视图保持架
视图v=LayoutFlater.from(parent.getContext()).flate(LayoutDetail,parent,false);
返回新的视图持有者(v);
}
@覆盖BindViewHolder上的公共无效(ViewHolder,int位置){
holder.bind(position,usersList.get(position),listener);
}
@凌驾
public int getItemCount(){
//返回RecyclerView将显示的元素数
返回usersList.size();
}
公共无效onNumberChanged(int值){
MySingleton.doMyToast(上下文,“新值为=“+value”);
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
公共设置Class getItem(内部位置){
返回usersList.get(位置);
}
//过滤类
公共空过滤器(字符串图表文本){
charText=charText.toLowerCase(Locale.getDefault());
printMyLog(2,“在回收器视图中”适配器.Filter开始{“+charText+”}”);
usersList.clear();
如果(ChartText.length()==0){
usersList.addAll(usersArrayList);
}
其他的
{
用于(设置类wp:usersArrayList)
{
printMyLog(3,“在回收器中_视图_适配器.Filter{“+wp.name+”}[“+wp.name.toLowerCase(Locale.getDefault())。包含(charText)+“]”;
if(wp.name.toLowerCase(Locale.getDefault()).contains(charText))
使用者