android - setOnFocusChangeListener - 在每个字符后触发

标签 android listview android-edittext baseadapter

我有以下自定义基础适配器。我有一个 ListView ,每个项目都有一个编辑文本。我想在用户离开 edittext 后立即保存该数据,但现在发生的情况是每次用户输入 1 个字符时,setOnFocusChangeListener 都会触发。我真的不知道为什么会这样。

我的自定义基础适配器类

public class ChecklistBaseAdapter extends BaseAdapter {
private static ArrayList<Checklist> searchArrayList;
Context currentcontext;
DatabaseHandler db;
private LayoutInflater mInflater;

public ChecklistBaseAdapter(Context context, ArrayList<Checklist> results) {

    searchArrayList = results;
    mInflater = LayoutInflater.from(context);
    currentcontext = context;
    db = new DatabaseHandler(currentcontext);
}

public int getCount() {

    return searchArrayList.size();
}

public void remove(int position) {

    searchArrayList.remove(position);
    notifyDataSetChanged();
}

public void removeAll() {

    searchArrayList.clear();
    notifyDataSetChanged();
}

public void add(Checklist checklist) {
    searchArrayList.add(checklist);

    notifyDataSetChanged();
}

public void notifyChange() {
    notifyDataSetChanged();
}

public Object getItem(int position) {

    return searchArrayList.get(position);

}

public long getItemId(int position) {

    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.checklistitem, null);
        holder = new ViewHolder();

        holder.cbStatus = (CheckBox) convertView
                .findViewById(R.id.checkbox);
        holder.etName = (EditText) convertView.findViewById(R.id.editname);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    Checklist checklist = (Checklist) getItem(position);

    holder.etName.setText(checklist.getName());

    holder.etName.setId(position);
    if (searchArrayList.get(position).getStatus().equals("F")) {
        holder.cbStatus.setChecked(false);
    } else {
        holder.cbStatus.setChecked(true);
    }

    holder.etName.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {

            if (actionId == EditorInfo.IME_ACTION_DONE) {
                int myint = v.getId();
                searchArrayList.get(myint)._name = v.getText().toString();
                return true;

            }
            return false;
        }
    });
    holder.etName
            .setOnFocusChangeListener(new OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    String input;
                    EditText editText;

                    if (!hasFocus) {
                        Log.e("test", "test123");
                        int myint = v.getId();
                        editText = (EditText) v;
                        input = editText.getText().toString();
                        searchArrayList.get(myint)._name = input;

                    }
                }
            });

    holder.cbStatus
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    String name = holder.etName.getText().toString().trim();
                    if (isChecked) {
                        for (int x = 0; x < searchArrayList.size(); x++) {
                            Checklist checklist = new Checklist();
                            checklist = searchArrayList.get(x);
                            if (name.equals(checklist.getName())) {
                                checklist.setStatus("T");
                                db.updateCheckList(checklist);
                                searchArrayList.set(x, checklist);
                            }
                        }
                    } else {
                        for (int x = 0; x < searchArrayList.size(); x++) {
                            Checklist checklist = new Checklist();
                            checklist = searchArrayList.get(x);
                            if (name.equals(checklist.getName())) {
                                checklist.setStatus("F");
                                searchArrayList.set(x, checklist);
                                db.updateCheckList(checklist);
                            }
                        }
                    }
                }
            });

    return convertView;
}

static class ViewHolder {

    CheckBox cbStatus;
    EditText etName;

}

最佳答案

尝试使用 addTextChangedListener() 方法

holder.etName.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                  String input;
                EditText editText;

                    Log.e("test", "test123");
                    int myint = v.getId();
                    editText = (EditText)v;
                    input = editText.getText().toString();
                    searchArrayList.get(myint)._name = input;

        });

希望对你有帮助。

关于android - setOnFocusChangeListener - 在每个字符后触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15428295/

相关文章:

android - 我怎样才能让 EditText 具有可点击的 Spannables 并且仍然可以通过 longClick 选择?

android - 查看状态在 onActivityResult 和 onResume 之间丢失

安卓 ListView : Can't get reliable checking behavior for CHOICE_MODE_SINGLE

android - 适用于 iOS 和 Android 的 Yammer URL 移动深层链接

android - 如何在ListView中捕获复选框事件

java - xml中的ListView,将Adapter设置为

Android EditText MultiLine 与句子大写

Android edittext - 选择联系人的电话号码(自动完成)

java - Activity 及其 Fragment 的单个布局文件和单个 java 文件

android - 钛 ios 和 Android 中的自动完成文本字段