Android 向ListView添加新项目:Can';不要修改内容

Android 向ListView添加新项目:Can';不要修改内容,android,listview,Android,Listview,编辑:我认为这篇文章因为这些编辑而变得一团糟。我将试着从一开始就解释这个问题 我有一个带有ListView的活动和一个添加新项目的按钮。 listview中的每个项目由一个EditText和两个按钮组成。 问题是,如果我添加一个新项,编辑文本中的文本将恢复为初始值 我正在添加具有以下内容的新项目: adapter.add(new Contacto("")); adapter.notifyDataSetChanged(); “Contacto”是我在arrayList中使用的类的名称 @Ifti

编辑:我认为这篇文章因为这些编辑而变得一团糟。我将试着从一开始就解释这个问题

我有一个带有ListView的活动和一个添加新项目的按钮。 listview中的每个项目由一个EditText和两个按钮组成。 问题是,如果我添加一个新项,编辑文本中的文本将恢复为初始值

我正在添加具有以下内容的新项目:

adapter.add(new Contacto(""));
adapter.notifyDataSetChanged();
“Contacto”是我在arrayList中使用的类的名称

@Iftikar Urrhman Khan建议我使用addTextChangedListener,但我不知道如何使用

这是我的customadapter的代码:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;

public class ContactsArrayAdapter extends ArrayAdapter<Contacto>{

    private ArrayList<Contacto> contactos;
    private Activity activity;

    public ContactsArrayAdapter(Activity a, int textViewResourceId, ArrayList<Contacto> contactos) {
        super(a, textViewResourceId, contactos);
        this.contactos = contactos;
        this.activity = a;
    }

    public static class ViewHolder{
        public EditText mail;
        public Button btn_contactos;
        public Button btn_delete;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;
        ViewHolder holder;

        final Contacto item = contactos.get(position);

        if (v == null) {
            LayoutInflater vi =
                (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.contacto, null);
            holder = new ViewHolder();
            holder.mail = (EditText) v.findViewById(R.id.txt_to);
            holder.btn_contactos = (Button) v.findViewById(R.id.btn_contacts);
            holder.btn_delete = (Button) v.findViewById(R.id.btn_delete);            
            v.setTag(holder);

            //Delete;
            holder.btn_delete.setTag(position);
            holder.btn_delete.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    int posicion = (Integer)v.getTag();
                    contactos.remove(posicion);
                    notifyDataSetChanged();
                }
            });

            //Add contacts
            holder.btn_contactos.setTag(position);
            holder.btn_contactos.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    //Log.d("TAG", "Botón contactos pulsado, pos: "+Integer.toString(pos));
                    ((Contactos)getContext()).setPosicion((Integer)v.getTag());

                    Intent intent =new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Email.CONTENT_URI);
                    ((Activity) v.getContext()).startActivityForResult(intent, MainActivity.act_pick_contact_mail);
                }
            });    

            //TextEdit Listener 
            holder.mail.addTextChangedListener(new TextWatcher(){
            @Override
            public void afterTextChanged(Editable arg0) {

                //holder.mail.setText(item.mail);
                //item.mail=arg0.toString();

                //int posi = (Integer)v.getTag();
                //contactos.set(posi, new Contacto(arg0.toString()));

                //contactos.get(pos).setMail(arg0.toString());

            }
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

            }
            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

            }           
            });

        }
        else holder=(ViewHolder)v.getTag();

        holder.mail.setTag(position);

        if (item != null) {
            holder.mail.setText(item.getMail());
        }

        return v;
    }
}
import java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.provider.contacts合同;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
公共类ContactsArrayAdapter扩展了ArrayAdapter{
私人ArrayList contactos;
私人活动;
公共联系人无线适配器(活动a、int-textViewResourceId、ArrayList contactos){
超级(a、textViewResourceId、contactos);
this.contactos=contactos;
本活动=a;
}
公共静态类视图持有者{
公共文本邮件;
公共按钮btn_接触器;
公共按钮btn_删除;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
视窗座;
最终联系人项目=联系人获取(位置);
如果(v==null){
放平机六=
(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气机\u服务);
v=vi.充气(R.布局.触点,空);
holder=新的ViewHolder();
holder.mail=(EditText)v.findViewById(R.id.txt_to);
holder.btn_contactos=(按钮)v.findViewById(R.id.btn_contacts);
holder.btn_delete=(按钮)v.findviewbyd(R.id.btn_delete);
v、 setTag(支架);
//删除;
holder.btn_delete.setTag(位置);
holder.btn_delete.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
int posicion=(整数)v.getTag();
触点移除(位置);
notifyDataSetChanged();
}
});
//添加联系人
支架.btn_接触器.设置标签(位置);
holder.btn_contactos.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//Log.d(“TAG”,“Botón contactos pulsado,pos:+Integer.toString(pos));
((Contactos)getContext()).setPosiOn((Integer)v.getTag());
意向意向=新意向(Intent.ACTION\u PICK,contacts contract.commondatatypes.Email.CONTENT\u URI);
((活动)v.getContext()).startActivityForResult(意图、主要活动、行为、选择、联系、邮件);
}
});    
//文本编辑侦听器
holder.mail.addTextChangedListener(新的TextWatcher(){
@凌驾
public void PostTextChanged(可编辑arg0){
//holder.mail.setText(item.mail);
//item.mail=arg0.toString();
//int posi=(整数)v.getTag();
//contactos.set(posi,新Contacto(arg0.toString());
//contactos.get(pos.setMail(arg0.toString());
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、int arg3){
}
@凌驾
public void onTextChanged(字符序列arg0、int arg1、int arg2、int arg3){
}           
});
}
else holder=(ViewHolder)v.getTag();
holder.mail.setTag(位置);
如果(项!=null){
holder.mail.setText(item.getMail());
}
返回v;
}
}

代码中的问题是,当editText值更改时,其在arraylist
contactos
中未更新

当您向数组列表中添加一个以上的项时,该项中具有相同的旧值

您可以将
addTextChangedListener
添加到编辑文本中

holder.mail.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {

}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {


}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

}});

您必须保存TextView值,因为notifydatasetchange为每个可见行再次调用get view保存TextView意味着什么?在执行adapter.notifyDataSetChanged()之前,是否需要使用文本更新arrayList,然后恢复文本?我已经调试了代码,看到了arrayList的内容,但没有使用屏幕的值进行更新。如何从我的活动中获取对每个项目的文本视图的引用,以获取它们的文本并更新数组?您必须保存更新的值扫描您发布的代码,这将有助于确定,我已经创建了侦听器(我已通过onTextChanged更改了上一个方法的名称)。我在方法afterTextChanged中设置了一个断点,并且多次被触发。问题是我不知道如何在不知道需要修改的项的索引的情况下更新arrayList。你知道如何从这个方法中获得这个索引吗?谢谢。@Richal您将在适配器中写入此代码,并在适配器中访问您的位置。我已尝试使用以下代码:contactos.set(posi,new Contacto(arg0.toString());uuuuuposi是一个属性,我在getView方法的开头用参数position更新它但是效果不太好。@Richal您可以在必须更新时发布contactos类,但代码为y吗