我已经搜索过这个但是无济于事我没有得到问题的确切答案。
我在ListView
内有一个按钮,当点击该按钮时,它会显示一个警告对话框来选择日期,选择日期后,所选日期将是该按钮的文本。代码工作正常,但当我向下滚动时,日期将随机更改
这是我的适配器的getView()
方法的代码。当我输入任何EditText
时,EditText
也会发生这种情况,但是当我开始滚动值时也改变了。
这是我的获取视图方法
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null){
convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);
viewHolder = new ViewHolder();
viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
viewHolder.txtNotes = (EditText) convertView.findViewById(R.id.rpNotes);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
RepeatEntryList repeatEntryList = listData.get(position);
viewHolder.btnDate.setText(repeatEntryList.getDate());
viewHolder.btnDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//EVEN IF I REMOVE THE CODE FOR SETTING THE BUTTON TEXT TO JUST LIKE THE BELOW CODE. SCROLLING ISSUES STILL PERSIST
viewHolder.btnDate.setText("just sample date text");
//**NOTE UPDATED**
//MY EDITTEXT ALSO HAVE THE SAME BEHAVIOR
}
});
viewHolder.txtNotes.setHint(contx.getResources().getString(R.string.placeholder_txt));
return convertView;
}
注意假设我在EditText
内有20个按钮和20个ListView
。当我向所有EditText
输入内容并通过点击更改按钮的文字时,向下滚动ListView
,EditText
和按钮的文字或值将会改变或交换,有时不见了。
关于我的问题,有人可以向我解释为什么ListView
表现得像这样,以及如何避免这种行为。
答案 0 :(得分:7)
在代码中进行更改删除if(convertView == null){} else {}条件并直接使用如下
convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);
Button btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
TextView txtNotes = (EditText) convertView.findViewById(R.id.rpNotes);
答案 1 :(得分:3)
在position
final
变量getView
final int position
并且还将你的模态课作为最终版。
final RepeatEntryList repeatEntryList = listData.get(position);
答案 2 :(得分:3)
只需添加以下行,repeatEntryList.setDate("选择日期")
datePickerTo.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strdate = (pickerTo.getMonth() + 1) + "-" + pickerTo.getDayOfMonth() + "-" + pickerTo.getYear();
viewHolder.btnDate.setText(mainActivity.pickerStringTodate(strdate));
//Here is your new line
repeatEntryList.setDate(mainActivity.pickerStringTodate(strdate))
try {
Date date1 = mainActivity.dateFormat.parse(viewHolder.btnDate.getText().toString());
Date date2 = mainActivity.dateFormat.parse(mainActivity.dateFormat.format(new Date()));
if (date1.before(date2)) {
Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}).setNegativeButton("Cancel", null);
datePickerTo.show();
答案 3 :(得分:2)
您正在使用if条件:
if (date1.before(date2)) {
Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
}else{viewHolder.btnDate.setVisibility(View.GONE);}
但没有别的情况。其他情况也应该处理。
答案 4 :(得分:1)
这就是我为解决我的问题而做的事情,因为有人可能会遇到同样的问题:
1.首先我在我的自定义Adapter类中创建i变量,它是RepeatEntryListAdapter并将其命名为listData
public ArrayList<RepeatEntryList> listData;
2。我引用listData变量作为RepeatEntryList类的数组列表,这是我的getter和setter类。
public RepeatEntryListAdapter(Context context,ArrayList<RepeatEntryList> listdata){
this.listData = listdata;
this.contx = context;
mainActivity = (MainActivity) context;
layoutInflater= LayoutInflater.from(context);
}
3。在getview方法中,我为按钮创建了click事件。在click事件中我实例化了我的getter类,然后使用我的getter类的实例化变量并使用settext,设置按钮的文本并设置的日期lisData 变量。重要的部分是使用 listData 变量,其中我使用位置变量来设置 listData 的某个位置的值,如同此
RepeatEntryList re = rListData;
viewHolder.btnDate.setText('07-06-2015')//say the date selected is the string inside setText re.setDate(viewHolder.btnDate.getText().toString());//set Date is a setter method inside my RepeatEntryList class
listData.set(position, re);//position variable should be final
4。这是解决我的自定义列表视图的滚动问题最棘手的部分,这是由edittext观察者引起的,滚动时触发。我做的是。
一个。我创建了一个像这样实现TextWatcher的类
class EditTextWatcher implements TextWatcher{
private int mPosition;
private boolean mActive;
void setPosition(int position){
mPosition = position;
}
void setActive(boolean active){
mActive = active;
}
@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(mActive){
//rNotes.set(mPosition,s.toString());
RepeatEntryList re = listData.get(mPosition);
re.setNotes(s.toString());
listData.set(mPosition,re);
}
}
}
湾我还在我的静态类ViewHolder
中为EditeTextWatcher创建了一个变量 static class ViewHolder{
public Button btnDate;
public EditText txtNotes;
public EditTextWatcher mWatcher;
}
℃。在我的getview方法中,我创建了一个EditTextWatcher()的新实例,它也创建了一个新的textwatcher而不使用最后一个事件,因为我创建了一个textwatcher的新实例
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final RepeatEntryList rListData = listData.get(position);
if(convertView == null){
convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);
viewHolder = new ViewHolder();
viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
viewHolder.mWatcher = new EditTextWatcher();
viewHolder.txtNotes = (EditText) convertView.findViewById(R.id.rpNotes);
viewHolder.txtNotes.addTextChangedListener(viewHolder.mWatcher);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.btnDate.setText(rListData.getDate());
viewHolder.mWatcher.setActive(false);
viewHolder.txtNotes.setText(rListData.getNotes());
viewHolder.mWatcher.setPosition(position);
viewHolder.mWatcher.setActive(true);
//here is the part of button click event i mention above (no 3.)
return convertView;
}