Java Android ListView中包含的EditText内容不是';我救不了你
在我的项目中,我必须向用户显示一个基本上包含EditText的ListView 这就像一份调查问卷,当他回答这个问题时,他可以下去回答下一个问题。(然后回去) 适配器上的公共类扩展了BaseAdapter{ 列出移动对象; 语境; 拉平机; HashMap-mChoix; HashMap-mrepons; HashMap-mreponseasctuel; 整数mPositionSelectionne; 整数干涉; /** *建设者 *@param上下文 *@param listpoints验证点列表。 *@param ListChoiExpoints验证从vérification points到vérification chaque point的vérification points的选择。 *@param listeReponsesPointsVerification réponses déjáfournies pour chaque point de vérification *@param-idIntervention-identification-de-l'intervention */ 公共网络适配器( 语境, 整数干涉, 列表ListPoints验证, List>ListChoExpointsVerification, ResponsePointVerification>ListResponseSpointsVerification){ this.mInflater=LayoutInflater.from(上下文); this.mContext=上下文; this.mObjects=ListPointsVerification; this.mChoix=listcooxpointsverification; this.mReponses=listreponsespointsverification; 这个。中间干预=中间干预; P/P关系式 this.mreponseasctuel=newhashmap(); } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 查看行; 最终整数idPointVerification=getItem(position).id; if(convertView==null) { row=mInflater.充气(R.layout.intervention\u Responses\u controle\u nombre,null); EditText-edValeur=(EditText)row.findViewById(R.id.edValeur); //洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛尔斯凯·洛 //电子注册 edValeur.addTextChangedListener(新的TextWatcher() @凌驾 public void onTextChanged(字符序列、int start、int before、int count){ } @凌驾 更改前的公共无效(字符序列、整数开始、整数计数、, 整数后){ } @凌驾 公共无效后文本已更改(可编辑){ //此hashmap是解决此错误的一种尝试 //我将所有修改注册到此hashmap中 普特先生( 国内流离失所者核查, s、 toString()); //保存过程 //例如,已删除 //但是我更新了我的数据库 } }); } 其他的 { 行=转换视图; } EditText-edValeur=(EditText)row.findViewById(R.id.edValeur); //更新案文 //它是hashmap中包含的 if(mreponsecatuel.containsKey(idPointVerification)){ 字符串valeur=mreponsecatuel.get(idPointVerification); edValeur.setText(valeur); //否则我会查数据库 }else if(mReponses!=null&&mReponses.containsKey(idPointVerification) &&mReponses.get(idPointVerification.valeur!=null){ edValeur.setText(mReponses.get(idPointVerification.valeur); } 其他的 { edValeur.setText(“”); } 返回行; } } 我不知道为什么,但用户在ListView中进入,内容未保存,并显示一些特殊值,如其他EditText。我没有发现如何纠正这种行为,这真的很匆忙 基本上,我制作了一个TextWatcher,它将数据注册到数据库中,也注册到一个包含所有值的临时HashMap中。当调用GetView时,该数据被回调。如果我删除该初始化,编辑文本将被删除 注意:我在代码中做了一些测试,所以可能会有不同的问题 编辑 我上传了一个有问题的项目: 以下是重现问题的步骤:Java Android ListView中包含的EditText内容不是';我救不了你,java,android,android-listview,Java,Android,Android Listview,在我的项目中,我必须向用户显示一个基本上包含EditText的ListView 这就像一份调查问卷,当他回答这个问题时,他可以下去回答下一个问题。(然后回去) 适配器上的公共类扩展了BaseAdapter{ 列出移动对象; 语境; 拉平机; HashMap-mChoix; HashMap-mrepons; HashMap-mreponseasctuel; 整数mPositionSelectionne; 整数干涉; /** *建设者 *@param上下文 *@param listpoints验证点
结果:在第四阶段,它加载“”字符串以加快大多数移动应用程序(Android iOS…)中的速度。列表单元格通常是循环使用的。这会特别为长列表节省内存。因此,您必须获取新显示单元的数据。当单元格离开屏幕时,其布局/视图将被破坏。在您的情况下,您必须将编辑文本的文本保存在某个位置。这就是您试图使用hashmap所做的 我看不出你的代码有什么特别的错误 如果问题是关于使用hashmap的“变通方法”,我确认您可以保存编辑文本的状态。使用hashmap是一种方法 顺便说一下,
getItem(position).id
可以替换为getItemId(position)
,这里就是为了这个目的
我不确定这些是否回答了你的问题
编辑
既然我正确理解了你的问题,我可以提供一些代码。我必须说,我对这件事并不完全满意
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;
}
}
public final class PointVerificationAdapter extends BaseAdapter {
List<BasicNameValuePair> mObjects;
Context mContext;
LayoutInflater mInflater;
HashMap<Integer, String> mReponsesActuel;
ArrayList<String> myItems = new ArrayList<String>();
public PointVerificationAdapter(
Context context,
List<BasicNameValuePair> listObjets
) {
this.mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mObjects = listObjets;
for (int i = 0; i < 30; i++) {
myItems.add(Integer.toString(i));
}
}
@Override
public int getCount() {
return mObjects.size();
}
@Override
public BasicNameValuePair getItem(int position) {
return mObjects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
static class ViewHolder {
EditText yourEditText;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null)
{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, parent, false);
convertView.setId(position);
holder.yourEditText = (EditText) convertView.findViewById(R.id.edValeur);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
((TextView) convertView.findViewById(R.id.tvNom)).setText(Integer.toString(position));
holder.yourEditText.setText(myItems.get(position));
holder.yourEditText.setId(position);
holder.yourEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View view, boolean hasFocus) {
if (!hasFocus){
final int position = view.getId();
final EditText editText = (EditText) view;
myItems.set(position, editText.getText().toString());
}
}
});
return convertView;
}
}
public final class PointVerificationAdapter extends BaseAdapter {
List<BasicNameValuePair> mObjects;
Context mContext;
LayoutInflater mInflater;
HashMap<Integer, String> mReponsesActuel;
ArrayList<String> myItems = new ArrayList<String>();
public PointVerificationAdapter(
Context context,
List<BasicNameValuePair> listObjets
) {
this.mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mObjects = listObjets;
for (int i = 0; i < 30; i++) {
myItems.add(Integer.toString(i));
}
}
@Override
public int getCount() {
return mObjects.size();
}
@Override
public BasicNameValuePair getItem(int position) {
return mObjects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
static class ViewHolder {
EditText yourEditText;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null)
{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.intervention_reponses_controle_nombre, parent, false);
convertView.setId(position);
holder.yourEditText = (EditText) convertView.findViewById(R.id.edValeur);
holder.yourEditText.setId(position);
holder.yourEditText.addTextChangedListener(new GenericTextWatcher(holder.yourEditText));
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
holder.yourEditText.setId(position);
}
((TextView) convertView.findViewById(R.id.tvNom)).setText(Integer.toString(position));
holder.yourEditText.setText(myItems.get(position));
return convertView;
}
private class GenericTextWatcher implements TextWatcher{
private View view;
private GenericTextWatcher(View view) {
this.view = view;
}
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
public void afterTextChanged(Editable editable) {
final int position = view.getId();
final EditText editText = (EditText) view;
myItems.set(position, editText.getText().toString());
}
}
}