Java 为什么EditText调用notifyDataSetChanged()方法?

Java 为什么EditText调用notifyDataSetChanged()方法?,java,android,Java,Android,我正在处理一个奇怪的情况。 我实现了一个扩展ArrayAdapter的类。 有两种视图类型,第一种视图为“classic”,第二种视图为EditText。只有一个项目可以同时具有第二种类型的视图。 当编辑文本处于焦点且键盘打开时,我的适配器会不断重新加载,并在一段时间后停止(不是修复)。 我不认为我重写的notifyDataSetChanged()方法使用不当: @Override public void notifyDataSetChanged() { Log.i("ADAPTER",

我正在处理一个奇怪的情况。 我实现了一个扩展ArrayAdapter的类。 有两种视图类型,第一种视图为“classic”,第二种视图为EditText。只有一个项目可以同时具有第二种类型的视图。 当编辑文本处于焦点且键盘打开时,我的适配器会不断重新加载,并在一段时间后停止(不是修复)。 我不认为我重写的notifyDataSetChanged()方法使用不当:

@Override
public void notifyDataSetChanged() {
    Log.i("ADAPTER","reload");
    super.notifyDataSetChanged();
}
我无法获取此日志,但已登录:

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    Log.i("ADAPTER","new view");
    //
    // some stuff
    //
    return convertView;
}
我有这个日志。 显示问题的视频:

公共类LabelAdapter扩展了ArrayAdapter{
专用接口ci;
专用数据库接口di;
选择私人项目;
公共静态int-NORMAL=0;
选择的公共静态int=1;
公共LabelAdapter(@NonNull上下文上下文、int资源、DatabaseInterface DatabaseInterface、ConfigInterface ConfigInterface){
super(上下文、资源、configInterface.getLabels());
this.di=数据库接口;
this.ci=configInterface;
itemSelected=-1;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
最终标签=此.getItem(位置);
最终int pos=位置;
Log.i(“测试”、“TOU”);
如果(getItemViewType(position)==选中){
convertView=LayoutInflater.from(getContext()).flate(R.layout.layout\u lv\u label\u edit,null);
EditText et=convertView.findViewById(R.id.et_label_name);//就是这个编辑文本
et.setText(label.getName());
et.requestFocus();
Log.i(“测试”、“选择”);
ImageView检查=convertView.findViewById(R.id.check);
check.setImageResource(R.drawable.ic_check);
ImageView del=convertView.findViewById(R.id.delete);
del.setImageResource(R.drawable.ic_delete);
返回视图;
}
否则{
Log.i(“测试”、“无选择”);
convertView=LayoutInflater.from(getContext()).flate(R.layout.layout\u lv\u label\u项,空);
TextView tv=convertView.findViewById(R.id.l_名称);
tv.setText(label.getName());
ImageView iv=convertView.findViewById(R.id.ic_标签);
iv.setImageResource(R.drawable.ic_标签);
iv.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.i(“监听”、“标签”);
}
});
试一试{
int color=color.parseColor(label.getColor());
iv.设置彩色滤光片(彩色);
}捕获(例外e){
}
TextView n=convertView.findViewById(R.id.number);
int n_ci=di.getCountDatabaseByLabel(label.getName());
如果(n_ci!=0)n.setText(“+n_ci”);
ImageView编辑=convertView.findViewById(R.id.edit);
编辑.setImageResource(R.drawable.ic_编辑);
edit.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
设置选择项(pos);
notifyDataSetChanged();
}
});
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.i(“倾听”、“项目”);
}
});
返回视图;
}
}
公共无效集合selecteditem(int posistion){
itemSelected=posistion;
}
@凌驾
public int getItemViewType(int位置){
如果(位置==itemSelected)返回1;
否则返回0;
}
@凌驾
public void notifyDataSetChanged(){
Log.i(“测试”、“重新加载”);
super.notifyDataSetChanged();
}
}

请显示您的
适配器的完整代码
我记不清了,但我在某个地方读到notifyDataSetChanged()是最后一个方法。而且您只需要调用notifyDataSetChanged()…您不需要重写iti override notifyDataSetChanged(),只需添加日志,看看我是否使用得很糟糕。我添加了适配器的完整代码。
public class LabelAdapter extends ArrayAdapter<Label> {

    private ConfigInterface ci;
    private DatabaseInterface di;
    private int itemSelected;

    public static int NORMAL = 0;
    public static int SELECTED = 1;

    public LabelAdapter(@NonNull Context context, int resource, DatabaseInterface databaseInterface, ConfigInterface configInterface) {
        super(context, resource, configInterface.getLabels());
        this.di = databaseInterface;
        this.ci = configInterface;
        itemSelected = -1;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final Label label = this.getItem(position);
        final int pos = position;
        Log.i("Test","tous");
        if (getItemViewType(position) == SELECTED){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_lv_label_edit, null);
            EditText et = convertView.findViewById(R.id.et_label_name); // it's this edit text
            et.setText(label.getName());
            et.requestFocus();
            Log.i("Test","select");
            ImageView check = convertView.findViewById(R.id.check);
            check.setImageResource(R.drawable.ic_check);
            ImageView del = convertView.findViewById(R.id.delete);
            del.setImageResource(R.drawable.ic_delete);
            return convertView;
        }
        else {
            Log.i("Test","no sel");
            convertView =    LayoutInflater.from(getContext()).inflate(R.layout.layout_lv_label_item, null);
            TextView tv = convertView.findViewById(R.id.l_name);
            tv.setText(label.getName());
            ImageView iv = convertView.findViewById(R.id.ic_label);
            iv.setImageResource(R.drawable.ic_label);
            iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("Listen","label");
                }
            });
            try {
                int color = Color.parseColor(label.getColor());
                iv.setColorFilter(color);
            } catch (Exception e) {
            }
            TextView n = convertView.findViewById(R.id.number);
            int n_ci = di.getCountDatabaseByLabel(label.getName());
            if (n_ci != 0) n.setText("" + n_ci);
            ImageView edit = convertView.findViewById(R.id.edit);
            edit.setImageResource(R.drawable.ic_edit);
            edit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    setSelectedItem(pos);
                    notifyDataSetChanged();
                }
            });
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("Listen","item");
                }
            });
            return convertView;
        }
    }

    public void setSelectedItem(int posistion){
        itemSelected = posistion;
    }

    @Override
    public int getItemViewType(int position) {
       if (position == itemSelected) return 1;
       else return 0;
    }

    @Override
    public void notifyDataSetChanged() {
        Log.i("Test","reload");
        super.notifyDataSetChanged();
    }
}