安卓ListView中使用EditText所遇到的一些问题

            平时使用EditText没什么问题,但是一在ListView中使用就有一大堆问题,首先是焦点问题:一进到界面ListView里的最后一个EditText 获取焦点并弹出输入法,找到的解决方法是在 EditText的上一层加入

           android:focusable="true"      

         android:focusableInTouchMode="true"

         <LinearLayout
            android:id="@+id/insearch_editline"
            android:layout_width="match_parent"
            android:layout_height="match_parent"        
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center_vertical"
            android:orientation="horizontal" >
            <EditText
                android:id="@+id/insearch_edit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@null" >
            </EditText>

      接着就是点击其中一个EditText弹出输入法时,获取的焦点消失了,再点又有,退出输入法时输入标又没了,网上找到的方法是:

        在Manifest中Activity标签下加入android:windowSoftInputMode="adjustPan"。  

       当你点击偏后的一项时,没有问题,输入框被托起,输入法不会挡住,退出输入法再点同一个EditText就挡住了,找到的方法是退出输入法时释放其焦点,但我弄了好久都没有解决。

      最后决定转换问题,就是把前面所遇到问题的解决方法都去掉,把输入法挡住的问题转成获取焦点的问题,然后解决焦点乱跑的问题就行了,以下是代码,随便加上了显示和保存数据的功能:

private String Userdata[] = { "省市", "生日", "性别", "昵称", "密码" };//显示的信息
private String[] Data = new String[Userdata.length];//保存数据
private int index = -1;// 保存当前item的位置,默认-1全部没有焦点
        /**所用到的适配器*/
	class PersonaAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return Data.length;
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(final int position, View convertView,
				ViewGroup parent) {
			// TODO Auto-generated method stub
			
			final Holder holder = new Holder();
			convertView = LayoutInflater.from(getBaseContext()).inflate(
					R.layout.perfect_data_item, null);
			holder.personaText = (TextView) convertView
					.findViewById(R.id.persona_text);
			holder.personaEdit = (EditText) convertView
					.findViewById(R.id.persona_edit);
		

			holder.personaText.setText(Userdata[position]);
                     //点击时获取焦点和保存点击位置
			holder.personaEdit.setOnTouchListener(new OnTouchListener() {

				@Override
				public boolean onTouch(View v, MotionEvent event) {
					if (event.getAction() == MotionEvent.ACTION_UP) {
						
						holder.personaEdit.setFocusableInTouchMode(true);
						index = position;
					}
					return false;
				}
			});
			if (index == position) {
				// 如果当前的行下标和点击事件中保存的index一致,EditText设置焦点。
				holder.personaEdit.setFocusableInTouchMode(true);
				holder.personaEdit.requestFocus();
			} else {
				holder.personaEdit.setFocusableInTouchMode(false);
				holder.personaEdit.clearFocus();
			}
                      //显示保存的数据
			if (Data[position] != null) {
				holder.personaEdit.setText(Data[position] + "");
			}

			holder.personaEdit
					.addTextChangedListener(new textWatcher(position));

			return convertView;
		}
	}

	class Holder {
		public EditText personaEdit;
		public TextView personaText;
	}

	class textWatcher implements TextWatcher {
		int position;

		public textWatcher(int position) {
			this.position = position;
		}

		@Override
		public void afterTextChanged(Editable s) {
			// TODO Auto-generated method stub
			//保存数据
			Data[position] = s.toString();
		}

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

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

	}
       在适配器里的getView不能复用,会造成数据存储混乱, 这样子就直接在代码里解决了,不用加入一些其他的。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值