背景
最近在开发答题类App,其中涉及到有多个填空题的这种可能。对于这种需求我就采用传统的ListVIew+Adapter的这种新式。(Ps:答题里面混合了单选、多选、填空、判断常见题型,其实就是为了方便)。主要是讲Adapter嵌入EditText所遇到的坑,给大家上一张效果图。
这是多个填空题出现的界面,其中遇到的问题就是多个输入框输入内容的时候,经过调试可知,键盘关闭的时候会再一次执行getView,这样对我们保存数据就又多执行了一次,显然是不符合我们的逻辑。先将代码粘贴如下,细节自行调整。
Adapter类
class OptionsListAdapter extends BaseAdapter {
private boolean flag=true;
private Context mContext;
private HashMap<Integer, String> contentMap = new HashMap<Integer, String>();// 保存edittext的数据,避免软键盘弹出和隐藏对数据的影响
ListView lv;
int index;
public List<QuestionOptionBean> options;
private int selectItem = -1;
private TextView ctv;
public OptionsListAdapter(Context context, List<QuestionOptionBean> options,
ListView lv, int index) {
this.mContext = context;
this.options = options;
this.lv = lv;
}
public int getCount() {
return options.size();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public boolean hasStableIds() {
return true;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
final ViewHolder viewHolder;
if (questionBean.getQuestion_type() == 4) {//多选填空题
if (view == null) {
view = LayoutInflater.from(mContext).inflate(
R.layout.item_edittext, null);
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
if (viewHolder.editText.getTag() instanceof TextWatcher) {
viewHolder.editText.removeTextChangedListener((TextWatcher)
viewHolder.editText.getTag());
}
if(flag)
{
if (!options.get(position).getName().isEmpty()) {//上一次提交的答案,现在要显示出来。
viewHolder.editText.setText(options.get(position).getDescription());
contentMap.put(position, viewHolder.editText.getText().toString());// 把改变后的数据存储起来
}
}
//确定EdtitText编辑位置
viewHolder.editText.setOnTouchListener(new View.OnTouchListener() {//确定EditText触摸位置
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_UP)
{
index = position;
flag=false;//如果确定光标位置后,则代表数据已发生变化,设置为false。
}
return false;
}
});
viewHolder.editText.addTextChangedListener(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) {
int tag = (int) viewHolder.editText.getTag();//确定EditText编辑位置
contentMap.put(tag, s.toString());// 把改变后的数据存储起来
}
});
// if (contentMap.get(position) != null) {
// viewHolder.editText.setText(contentMap.get(position));
// } else {
// viewHolder.editText.setText("");
// }
// // 设置焦点和edittext设置光标位置,记住啊.一定要先设置text.然后再设置焦点和光标位置
// if (index != -1 && index == position) {
// viewHolder.editText.requestFocus();
// viewHolder.editText.setSelection(viewHolder.editText.getText().toString().length());
// }
} else { //选择题
view = LayoutInflater.from(mContext).inflate(
R.layout.list_item_option, null);
ctv = (TextView) view.findViewById(R.id.ctv_name);
TextView option = (TextView) view.findViewById(R.id.tv_option);
ctv.setText(options.get(position).getName());
option.setText(options.get(position).getDescription());
updateBackground(position, ctv);
}
// if (position == selectItem) {
// ctv.setBackgroundResource(R.drawable.option_btn_single_checked);
// notifyDataSetChanged();
// }
// else {
// ctv.setBackgroundResource(R.drawable.option_btn_single_normal);
// notifyDataSetChanged();
// }
return view;
}
public void updateBackground(int position, TextView view) {
int backgroundId;
selectItem = -1;
if (lv.isItemChecked(position)) {
backgroundId = R.drawable.shape_red_point;
view.setTextColor(getResources().getColor(R.color.white));
} else {
backgroundId = R.drawable.shape_red_unpoint;
view.setTextColor(getResources().getColor(R.color.back));
}
Drawable background = mContext.getResources().getDrawable(backgroundId);
view.setBackgroundDrawable(background);
notifyDataSetChanged();
}
public void setSelectItem(int selectItem) {
this.selectItem = selectItem;
}
}
end
不用想网上说的那样设置ListView宽度,毕竟这样做体验不是很好,我也没有尝试这种方法,我通过改变状态不然它再去执行getView()刷新。工作上遇到的问题,以供参考,谢谢。