天天看點

Android:ListView中包含EditText 文字沖突 複用 焦點 軟鍵盤問題

效果圖:

Android:ListView中包含EditText 文字沖突 複用 焦點 軟鍵盤問題

界面:MainActivity 一個listview  item 一個EditText

軟鍵盤問題:清單檔案添加 windowSoftInputMode="adjustPan"

焦點複用,内容沖突:見代碼注釋

核心代碼:

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private HashMap<Integer, String> hashMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化控件
        initView();
    }

    private void initView() {
        listView = (ListView) findViewById(R.id.listView);
        hashMap = new HashMap<>();
        listView.setAdapter(new MyAdapter());
    }

    private class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return 50;
        }

        @Override
        public Object getItem(int position) {
            return hashMap.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            //初始化控件,擷取輸入框控件
            if(convertView == null){
                convertView = View.inflate(getApplicationContext(),R.layout.item,null);
            }

            EditText editText = (EditText) convertView.findViewById(R.id.editText);

            //為了避免輸入框監聽的沖突,解綁監聽
            if(editText.getTag() instanceof TextWatcher){
                editText.removeTextChangedListener((TextWatcher) editText.getTag());
            }


            //給輸入框控件指派,添加監聽
            editText.setText(hashMap.get(position));
            editText.setTextColor(Color.BLACK);

            TextWatcher textWatcher = new TextWatcher() {

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

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

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(TextUtils.isEmpty(s)){
                        hashMap.put(position,"");
                    }else {
                        hashMap.put(position,s.toString());
                    }
                }
            };

            editText.addTextChangedListener(textWatcher);

            //editText和監聽綁定
            editText.setTag(textWatcher);

            //解決焦點複用bug
            editText.clearFocus();


            return convertView;
        }
    }
}
           

繼續閱讀