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))
使用者