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