在我的项目中,我必须向用户展示一个基本上包含 EditText 的 ListView。
这就像一个问卷,当他回答问题时,他可以向下回答下一个问题。(然后回去)
public class onAdapter extends BaseAdapter {
List<PointVerification> mObjects;
Context mContext;
LayoutInflater mInflater;
HashMap<Integer, List<ChoixPointVerification>> mChoix;
HashMap<Integer, ReponsePointVerification> mReponses;
HashMap<Integer, String> mReponsesActuel;
Integer mPositionSelectionne;
Integer mIdIntervention;
/**
* Constructeur
* @param context
* @param listePointsVerification Liste des points de vérification à afficher.
* @param listeChoixPointsVerification liste des choix de points de vérification pour chaque point de vérification.
* @param listeReponsesPointsVerification réponses déjà fournies pour chaque point de vérification
* @param idIntervention Identifiant de l'intervention
*/
public onAdapter(
Context context,
Integer idIntervention,
List<PointVerification> listePointsVerification,
List<ChoixPointVerification>> listeChoixPointsVerification,
ReponsePointVerification> listeReponsesPointsVerification) {
this.mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mObjects = listePointsVerification;
this.mChoix = listeChoixPointsVerification;
this.mReponses = listeReponsesPointsVerification;
this.mIdIntervention = idIntervention;
// préparation des réponses par position
this.mReponsesActuel = new HashMap<Integer, String>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
final Integer idPointVerification = getItem(position).id;
if (convertView == null)
{
row = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, null);
EditText edValeur = (EditText) row.findViewById(R.id.edValeur);
// Ajout de l'évènement lorsque l'on change la valeur
// evènement d'enregistrement
edValeur.addTextChangedListener(new TextWatcher()
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
// This hashmap is a try workaround to the bug
// i register all modifications into this hashmap
mReponsesActuel.put(
idPointVerification,
s.toString());
// SAVE PROCEDURE
// REMOVED FOR THE EXAMPLE
// BUT I UPDATE MY DATABASE
}
});
}
else
{
row = convertView;
}
EditText edValeur = (EditText) row.findViewById(R.id.edValeur);
// update of the text
// it is the contained in the hashmap
if (mReponsesActuel.containsKey(idPointVerification)) {
String valeur = mReponsesActuel.get(idPointVerification);
edValeur.setText(valeur);
// otherwhise i will look into the database
} else if (mReponses != null && mReponses.containsKey(idPointVerification)
&& mReponses.get(idPointVerification).valeur != null) {
edValeur.setText(mReponses.get(idPointVerification).valeur);
}
else
{
edValeur.setText("");
}
return row;
}
}
我不知道为什么,但用户进入 ListView,内容未保存并显示一些特殊值,如其他 EditText。我没有找到如何纠正这种行为,而且真的很匆忙。
基本上我做了一个TextWatcher,它将数据注册到数据库中,也注册到一个包含所有值的临时HashMap中。调用 GetView 时会回调该数据。如果我删除该初始化,则 EditText 将被删除。
注意:我在我的代码中做了一些测试,所以可能会有不同的问题。
编辑
我上传了一个有问题的项目:http: //dl.free.fr/rbqOhUfJF
这里重现问题的步骤:
以调试模式启动项目
写在第一行 A,第二行 B,第三行 C
向下滚动直到 C 被隐藏
向上滚动到顶部。结果:没有更多文本。
如果您仔细查看调试日志,您可以看到与 afterText 的行。每次我们在第 2 部分中编写一些文本时,都会有一个带有事件注册的调试行。
但是在第 3 阶段,当您隐藏一个项目时。活动将以“”启动
结果:在第四阶段,它加载了“”字符串