Android中ListView的item为EditText,点击EditText出现键盘但马上键盘就退出了

郑汉 2014-10-23 05:16:06
1.MainActivity.java
package com.example.mytest1;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {
private ListView freegift_lv;
private FreeGiftListAdapter adapter_gift;
private List<String> stringList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_freegift);
stringList = new ArrayList<String>();
stringList.add(new String("String 1"));
stringList.add(new String("String 2"));
stringList.add(new String("String 3"));
stringList.add(new String("String 4"));
freegift_lv = (ListView) findViewById(R.id.freegift_lv);
showList_gift(stringList);
/*but = (Button) findViewById(R.id.freegift_lv);
but.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Dialog builder = new Dialog(MainActivity.this, R.style.MyDialog);
Window dialogWindow = builder.getWindow();
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
p.height = (int) (d.getHeight() * 1.0); // 高度设置为屏幕的0.6
p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.65
dialogWindow.setAttributes(p);
Window dialogWindow = builder.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);
lp.x = 100; // 新位置X坐标
lp.y = 100; // 新位置Y坐标
lp.width = 300; // 宽度
lp.height = 300; // 高度
lp.alpha = 0.7f; // 透明度
dialogWindow.setAttributes(lp);
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_style, null);
builder.setCancelable(true);
builder.setContentView(view);
text1 = (TextView) findViewById(R.id.dialog_title);
text1 = (TextView) findViewById(R.id.dialog_content);
but1 = (Button) findViewById(R.id.dialog_confirm);
builder.show();
}
});*/
}
private void showList_gift(List<String> entityList) {
if (adapter_gift == null) {
adapter_gift = new FreeGiftListAdapter(entityList, this);
freegift_lv.setAdapter(adapter_gift);
} else {
adapter_gift.changeData(entityList);
}

}
}

2.FreeGiftListAdapter.java
package com.example.mytest1;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


public class FreeGiftListAdapter extends BaseAdapter {
private List<String> dataSource;
private LayoutInflater inflater;
private ViewHolder holder;
// private Context context;

public FreeGiftListAdapter(List<String> dataSource, Context context) {
// this.context=context;
this.dataSource = dataSource;
this.inflater = LayoutInflater.from(context);
}

public void changeData(List<String> giftList) {
this.notifyDataSetChanged();
}

@Override
public int getCount() {
return dataSource.size();
}

@Override
public Object getItem(int arg0) {
return dataSource.get(arg0);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.activity_freegift_item, null);
holder.gift_num = (EditText) convertView
.findViewById(R.id.gift_num);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(dataSource.get(position));
holder.gift_num.setOnFocusChangeListener(new OnFocusChangeListenerImpl(position));
return convertView;
}

class ViewHolder {
EditText gift_num;
TextView name;
}
private class OnFocusChangeListenerImpl implements OnFocusChangeListener {
private int position;
public OnFocusChangeListenerImpl(int position) {
this.position = position;
}
@Override
public void onFocusChange(View arg0, boolean arg1) {
EditText et = (EditText) arg0;
if(arg1) {
Log.e("", "获得焦点");
} else {
Log.e("", "失去焦点");
}
}

}
}

3.MainActivity.java的布局文件activity_freegift.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/freegift_lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

4.FreeGiftListAdapter.java的布局文件activity_freegift_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<EditText
android:id="@+id/gift_num"
android:layout_weight="1"
android:layout_width="200dp"
android:background="@drawable/free_gift_adapter_edittext"
android:layout_height="200dp" />
<TextView
android:layout_weight="1"
android:id="@+id/name"
android:layout_width="wrap_content"
android:background="@drawable/free_gift_adapter_edittext"
android:layout_height="wrap_content" />
</LinearLayout>

在下图中,左边虚线的方框是EditText,当我点按它时,虽然有键盘弹出,但是马上键盘的退出了。这个问题要怎么解决呢?CSDN上的大神望不吝赐教!
...全文
1325 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
nj_dobetter 2016-02-03
  • 打赏
  • 举报
回复
这个问题的原因是ListView中的Item是EditText导致的。 ListView在界面大小发生更改时候,会重新布局整个界面,同时会复用上次ListView中的Child。 问题就在这: 点击EditText --》 弹出键盘 --》 ListView重新布局 -》 复用或者重新创建EditText -》 原来的EditText 消失或者没有焦点了 -》 键盘消失。 你如果在EditText曾经输入成功过文字的话,文字也会消失。 方案:对于获得焦点位置的Item,控制ListView的Item Type,让它不要被ListView复用。
无敌熊猫侠 2016-02-03
  • 打赏
  • 举报
回复
引用 19 楼 pengguohua1988 的回复:
[quote=引用 14 楼 u010414893 的回复:] [quote=引用 12 楼 xj396282771 的回复:] 试了半天还是没有给你弄出来 ,但是能得到一个结论。就是连续点击同一个EditText两次以上就能正常输入了。我再试试别的方法
谢谢支持啊![/quote]android:windowSoftInputMode="adjustPan"这个属性完美的解决了! 你试试![/quote] 在Android5.0及以上版本,这个方法又不好用了。。。
qq_23879009 2015-08-24
  • 打赏
  • 举报
回复
谢谢你也让我解决了这问题
yanwushu 2015-08-22
  • 打赏
  • 举报
回复
谢谢@pengguohua1988 问题解决
Jing丶無雙 2014-11-06
  • 打赏
  • 举报
回复
引用 23 楼 pengguohua1988 的回复:
结贴啊
很抱歉 本人并非楼主
Jing丶無雙 2014-11-05
  • 打赏
  • 举报
回复
引用 21 楼 pengguohua1988 的回复:
在AndroidManifest.xml中设置activity的属性时加这个
十分感谢,在AndroidManifest.xml中设置activity的属性时加android:windowSoftInputMode="adjustPan"。果然就行了
MR__P 2014-11-05
  • 打赏
  • 举报
回复
引用 22 楼 xj396282771 的回复:
[quote=引用 21 楼 pengguohua1988 的回复:] 在AndroidManifest.xml中设置activity的属性时加这个
十分感谢,在AndroidManifest.xml中设置activity的属性时加android:windowSoftInputMode="adjustPan"。果然就行了[/quote]结贴啊
MR__P 2014-11-04
  • 打赏
  • 举报
回复
引用 20 楼 xj396282771 的回复:
[quote=引用 19 楼 pengguohua1988 的回复:] android:windowSoftInputMode="adjustPan"这个属性完美的解决了! 你试试!
我试过你给的的这些属性设置了,仍旧不行,问一下 你这个属性石设置给EditText还是ListView啊??[/quote]在AndroidManifest.xml中设置activity的属性时加这个
Jing丶無雙 2014-10-30
  • 打赏
  • 举报
回复
引用 19 楼 pengguohua1988 的回复:
android:windowSoftInputMode="adjustPan"这个属性完美的解决了! 你试试!
我试过你给的的这些属性设置了,仍旧不行,问一下 你这个属性石设置给EditText还是ListView啊??
MR__P 2014-10-27
  • 打赏
  • 举报
回复
引用 14 楼 u010414893 的回复:
[quote=引用 12 楼 xj396282771 的回复:] 试了半天还是没有给你弄出来 ,但是能得到一个结论。就是连续点击同一个EditText两次以上就能正常输入了。我再试试别的方法
谢谢支持啊![/quote]android:windowSoftInputMode="adjustPan"这个属性完美的解决了! 你试试!
MR__P 2014-10-27
  • 打赏
  • 举报
回复
引用 14 楼 u010414893 的回复:
[quote=引用 12 楼 xj396282771 的回复:] 试了半天还是没有给你弄出来 ,但是能得到一个结论。就是连续点击同一个EditText两次以上就能正常输入了。我再试试别的方法
谢谢支持啊![/quote]<activity android:name="com.example.mytest1.MainActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustNothing" >在这里添加android:windowSoftInputMode="adjustNothing" 属性,键盘在弹出的时候你的adapter进行了刷新。我现在只能找到这种解决办法。
落幕-无悔 2014-10-27
  • 打赏
  • 举报
回复
根据上面的朋友说的需要点击2次就可以输入的话 我提出的意,LZ你试下看看 LZ你使用OnFocusChangeListenerImpl监听事件是有需求吗 你改为用setOnClickListener与setOnTouchListener监听事件2个都进行监听
Jing丶無雙 2014-10-27
  • 打赏
  • 举报
回复
楼主弄好了 ,给我说下你怎么处理的啊
Jing丶無雙 2014-10-27
  • 打赏
  • 举报
回复
虽然现在我还没有这方面需求,但是我也很想知道这个怎么才能处理好
郑汉 2014-10-25
  • 打赏
  • 举报
回复
引用 12 楼 xj396282771 的回复:
试了半天还是没有给你弄出来 ,但是能得到一个结论。就是连续点击同一个EditText两次以上就能正常输入了。我再试试别的方法
谢谢支持啊!
郑汉 2014-10-25
  • 打赏
  • 举报
回复
这个问题好难啊,没有人遇到过吗?我感觉我的需求也不是很傻逼啊。 阶段结论:应该是键盘出现的时候,重画了布局,所以又使EditText失去焦点了。
Jing丶無雙 2014-10-24
  • 打赏
  • 举报
回复
哦 这次弄好了刚才出了点儿 问题 ,我这就帮你看看
郑汉 2014-10-24
  • 打赏
  • 举报
回复
引用 9 楼 xj396282771 的回复:
我从你给的网站下了代码 ,直接导入eclipse中出现的一些错误。你看看截了些图 这样我就表示处理不好了,如果能正常运行你的项目,我才可能帮你解决出来
你有没有把appcompat_v7_3这个文件作为工程的Library? 麻烦麻烦帮帮看一下了。
Jing丶無雙 2014-10-24
  • 打赏
  • 举报
回复
我从你给的网站下了代码 ,直接导入eclipse中出现的一些错误。你看看截了些图 这样我就表示处理不好了,如果能正常运行你的项目,我才可能帮你解决出来
郑汉 2014-10-24
  • 打赏
  • 举报
回复
我是提问者 http://vdisk.weibo.com/s/FDYvnsW1WJLol 代码可以在这里下载!
加载更多回复(8)

80,361

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧