Java 在ListView中编辑文本行为
我使用以下代码在列表视图中显示编辑框 我的每个ListView项都包含以下模式Java 在ListView中编辑文本行为,java,android,eclipse,Java,Android,Eclipse,我使用以下代码在列表视图中显示编辑框 我的每个ListView项都包含以下模式 [EditText 1] [EditText 2] [EditText 3 ][EditText 4][EditText 5] class CustomArrayAdapterForScore extends ArrayAdapter<ScoreModel> { public CustomArrayAdapterForScore()
[EditText 1] [EditText 2] [EditText 3 ][EditText 4][EditText 5]
class CustomArrayAdapterForScore extends ArrayAdapter<ScoreModel>
{
public CustomArrayAdapterForScore()
{
super(MeetScore.this, R.layout.score_event_layout, myScoreArray);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
View view = null;
LayoutInflater inflator = MeetScore.this.getLayoutInflater();
view = inflator.inflate(R.layout.score_event_layout, parent, false);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.title = (TextView) view.findViewById(R.id.title);
viewHolder.box1 = (EditText) view.findViewById(R.id.box1);
viewHolder.box2 = (EditText) view.findViewById(R.id.box2);
viewHolder.box3 = (EditText) view.findViewById(R.id.box3);
viewHolder.box4 = (EditText) view.findViewById(R.id.box4);
viewHolder.box5 = (EditText) view.findViewById(R.id.box5);
viewHolder.box6 = (EditText) view.findViewById(R.id.box6);
viewHolder.box1.addTextChangedListener(new TextWatcher()
{
public void onTextChanged(CharSequence c, int arg1, int arg2, int arg3)
{
ScoreModel score = myScoreArray.get(position);
score.box1 = Integer.valueOf(viewHolder.box1.getText().toString());
myScoreArray.set(position, score);
listView.invalidateViews();
}
public void beforeTextChanged(CharSequence c, int arg1, int arg2, int arg3){}
public void afterTextChanged(Editable arg0){}
});
view.tag(viewHolder);
return view;
[EditText 1][EditText 2][EditText 3][EditText 4][EditText 5]
类CustomArrayAdapterForScore扩展了ArrayAdapter
{
公共CustomArrayAdapterForScore()
{
超级(MeetScore.this、R.layout.score\u event\u layout、myScoreArray);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图=空;
LayoutFlater充气器=meetCore.this.getLayoutFlater();
视图=充气机。充气(R.layout.score\u event\u布局,父级,false);
最终ViewHolder ViewHolder=新的ViewHolder();
viewHolder.title=(TextView)view.findViewById(R.id.title);
viewHolder.box1=(EditText)view.findViewById(R.id.box1);
viewHolder.box2=(EditText)view.findViewById(R.id.box2);
viewHolder.box3=(EditText)view.findViewById(R.id.box3);
viewHolder.box4=(EditText)view.findViewById(R.id.box4);
viewHolder.box5=(EditText)view.findViewById(R.id.box5);
viewHolder.box6=(EditText)view.findViewById(R.id.box6);
viewHolder.box1.addTextChangedListener(新的TextWatcher()
{
public void onTextChanged(字符序列c、int arg1、int arg2、int arg3)
{
ScoreModel score=myScoreArray.get(位置);
score.box1=Integer.valueOf(viewHolder.box1.getText().toString());
myScoreArray.set(位置、分数);
listView.invalidateViews();
}
public void beforeTextChanged(字符序列c、int arg1、int arg2、int arg3){}
public void posterextchanged(可编辑arg0){}
});
view.tag(viewHolder);
返回视图;
当我更改编辑框的文本时,单击它并使用键盘写入,例如,如果我写入9,则显示9,但一旦键盘消失,文本几乎消失。编辑文本显示空白
怎么了
convertView
时,您总是在膨胀新视图getView()
中看到对listView.invalidateViews()的调用。这可能会导致listView
在每次文本更改时失效。在失效时,getView()
被调用,一个新的TextChangedListener
被附加到EditText
上。所有这样的侦听器都在做相同的事情n次,这会造成混乱
mycorearray
)这不是您使用ViewHolder的方式。这是您应该如何使用它:
public View getView(...)
{
View rootView=convertView;
ViewHolder holder;
if(rootView==null)
{
rootView=inflater....
rootView.setTag(holder =new ViewHolder());
//...
}
else holder=(ViewHolder) rootView.getTag();
//...
}
listView中的EditText有问题,因为它会导致listView项因软键盘而移动。请设置清单:
android:windowSoftInputMode="adjustPan"
(我不确定该值是否正确)。或者,创建一个用于编辑所选项目的对话框。我不确定为什么会发生这种情况,除非这与您调用
invalidateViews()有关
在您的列表视图中
而不保存编辑文本中的内容
。但是从我看来,您没有正确使用视图持有者
。您每次都在重新创建视图
,但是视图持有者
是这样的,因此您不必每次都从资源中重新创建它们。您应该保存您的ViewHolder
类中的每个视图
,然后使用该视图获取对您的视图的引用
其他时间您可以用代码进行解释吗?无效视图是为测试而添加的,我已将其删除并显示相同的视图。检查编辑的codelistView.invalidateViews()我添加到测试中。没有它,响应相同。我将标记中的每个viewHolder设置为view,然后返回view