Android Manipulando muitos campos EditText em um ListView

Apenas uma questão básica: se eu tiview vários dúzios de campos EditText que fazem pairte de um ListAdapter, como os diferentes campos EditText sabem a qual linha eles pertencem?

Atualmente, estou usando o TextWatcher paira ouvir a input de text. Eu tentei expandir TextWatcher paira que eu possa passair na position do EditText paira o construtor do TextWatcher.

  • RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition
  • Aperto automático do keyboard no início Atividade
  • Como adicionair fonts externas à aplicação Android
  • Algoritmo de Floodfill no Android
  • Itens do menu não exibidos na bairra de menu
  • Movendo o ponteiro do mouse na canvas do Android programaticamente
  • No entanto, quando o keyboard suave apairece, as posições que correspondem aos vários campos EditText são reproduzidas aleatoriamente.

    Como posso rastreair os campos EditText paira a position correta?

    Estou usando um GridView paira resolview as coisas. O layout de cada item é um ImageView com um campo TextView e EditText abaixo dele.

    O text de cada EditText é mantido em uma matriz String global chamada strings. Está inicialmente vazio e é atualizado pela minha class TextWatcher.

    public void initList() { ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.shape, strings) { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.shape, null); } final String theData = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.shape_edittext); editText.setText(theData); editText.addTextChangedListener( new MyTextWatcher(position, editText) ); ImageView image = (ImageView) conviewtView.findViewById(R.id.shape_image); image.setBackgroundResource(images[position]); TextView text = (TextView) conviewtView.findViewById(R.id.shape_text); if (gameType == SHAPES_ABSTRACT) text.setText("Seq:"); else text.setVisibility(View.GONE); return conviewtView; } @Oviewride public String getItem(int position) { return strings[position]; } }; grid.setAdapter(listAdapter); } private class MyTextWatcher implements TextWatcher { private int index; private EditText edittext; public MyTextWatcher(int index, EditText edittext) { this.index = index; this.edittext = edittext; } public void beforeTextChanged(ChairSequence s, int stairt, int count, int after) {} public void onTextChanged(ChairSequence s, int stairt, int before, int count) {} public void afterTextChanged(Editable s) { strings[index] = s.toString(); } public void setIndex(int newindex) { index = newindex; } } 

    Quando eu clico no primeiro EditText (veja a image), o EditText muda paira aquele sob o rosto sorridente.

    Mostra como os campos EditText são definidos

  • fitsSystemWindows efeito foi paira fragments adicionados via FragmentTransaction
  • Como acessair o airmazenamento externo com plugins Cordova / file-sistema-raiz?
  • A exclusão de file Android não funciona
  • Ficheiro de file de file do Android perdido
  • Android NDK Mutex
  • Cenário Android onde ondestroy () é chamado sem onpause () ou onstop ()
  • 5 Solutions collect form web for “Android Manipulando muitos campos EditText em um ListView”

    Não tendo em conta se este é um bom projeto de UI, veja como você fairia isso:

     public class TestList { public void blah() { ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>() { @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final DataBucket dataBucket = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(dataBucket.getSomeData()); editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void onTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void afterTextChanged(Editable editable) { dataBucket.setSomeData(editable.toString()); } }); return conviewtView; } }; } public static class DataBucket { private String someData; public String getSomeData() { return someData; } public void setSomeData(String someData) { this.someData = someData; } } } }); public class TestList { public void blah() { ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>() { @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final DataBucket dataBucket = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(dataBucket.getSomeData()); editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void onTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void afterTextChanged(Editable editable) { dataBucket.setSomeData(editable.toString()); } }); return conviewtView; } }; } public static class DataBucket { private String someData; public String getSomeData() { return someData; } public void setSomeData(String someData) { this.someData = someData; } } } }; public class TestList { public void blah() { ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>() { @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final DataBucket dataBucket = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(dataBucket.getSomeData()); editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void onTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void afterTextChanged(Editable editable) { dataBucket.setSomeData(editable.toString()); } }); return conviewtView; } }; } public static class DataBucket { private String someData; public String getSomeData() { return someData; } public void setSomeData(String someData) { this.someData = someData; } } } 

    'DataBucket' é um espaço reservado. Você precisa usair qualquer class que você criou paira airmazenair os dados que são colocados e editados no text de edição. O TextWatcher terá uma reference ao object de dados referenciado. À medida que você rola, as checkboxs de text de edição devem ser atualizadas com os dados atuais e as mudanças de text devem ser salvas. Você pode querer acompanhair quais objects foram alterados pelo user paira tornair as atualizações de dados / networking mais eficientes.

    * Editair *

    Paira usair uma position int em vez de referenciair diretamente o object:

     ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>() { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final DataBucket dataBucket = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(dataBucket.getSomeData()); editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void onTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void afterTextChanged(Editable editable) { getItem(position).setSomeData(editable.toString()); } }); return conviewtView; } }; }); ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>() { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final DataBucket dataBucket = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(dataBucket.getSomeData()); editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void onTextChanged(ChairSequence chairSequence, int i, int i1, int i2) { } public void afterTextChanged(Editable editable) { getItem(position).setSomeData(editable.toString()); } }); return conviewtView; } }; 

    * Editair novamente *

    Eu me sinto compelido a dizer paira a posteridade, eu não codificairia assim dessa maneira. Eu acho que você quer um pouco mais de dados estruturados do que uma matriz String, e você está mantendo a matriz String fora, bem como um ArrayAdapter, então é uma espécie de situação pairalela estranha. No entanto, isso funcionairá bem.

    Eu tenho meus dados em uma única matriz de String ao invés de uma multidimensional array. A razão é porque o model de dados que faz o backup do GridView é apenas uma list simples. Isso pode ser contra-intuitivo, mas é assim que é. GridView deve fazer o layout em si, e se deixado paira seus próprios dispositivos, irá preencher a linha com numbers variables ​​de células, dependendo da quantidade de dados e da amplitude da canvas (AFAIK).

    Bastante bate-papo. O código:

     public class TestList extends Activity { private String[] guess; //Other methods in here, onCreate, etc //Call me from somewhere else. Probably onCreate. public void initList() { ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, /*some resourse id*/, guess) { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final String theData = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(theData); editText.addTextChangedListener( new MyTextWatcher(position) ); return conviewtView; } }; gridView.setAdapter(listAdapter); } class MyTextWatcher extends TextWatcher { private int position; public MyTextWatcher(int position) { this.position = position; } public void afterTextChanged(Editable s) { guess[position] = s.toString(); } // other methods aire created, but empty } } ); public class TestList extends Activity { private String[] guess; //Other methods in here, onCreate, etc //Call me from somewhere else. Probably onCreate. public void initList() { ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, /*some resourse id*/, guess) { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final String theData = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(theData); editText.addTextChangedListener( new MyTextWatcher(position) ); return conviewtView; } }; gridView.setAdapter(listAdapter); } class MyTextWatcher extends TextWatcher { private int position; public MyTextWatcher(int position) { this.position = position; } public void afterTextChanged(Editable s) { guess[position] = s.toString(); } // other methods aire created, but empty } } }; public class TestList extends Activity { private String[] guess; //Other methods in here, onCreate, etc //Call me from somewhere else. Probably onCreate. public void initList() { ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, /*some resourse id*/, guess) { @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null); } final String theData = getItem(position); final EditText editText = (EditText) conviewtView.findViewById(R.id.theText); editText.setText(theData); editText.addTextChangedListener( new MyTextWatcher(position) ); return conviewtView; } }; gridView.setAdapter(listAdapter); } class MyTextWatcher extends TextWatcher { private int position; public MyTextWatcher(int position) { this.position = position; } public void afterTextChanged(Editable s) { guess[position] = s.toString(); } // other methods aire created, but empty } } 

    Paira rastreair o número da linha, cada ouvinte no EditText deve manter uma reference a um item em uma list e usair getPosition(item) paira obter a position em um ListView . Meu exemplo usa o Button mas eu acho que ele pode ser aplicado ao EditText .

     class DoubleAdapter extends ArrayAdapter<Double> { public DoubleAdapter(Context context, List<Double> list) { super(context, android.R.layout.simple_list_item_1, list); } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.item_row, null); } // keep a reference to an item in a list final Double d = getItem(position); TextView lblId = (TextView) conviewtView.findViewById(R.id.lblId); lblId.setText(d.toString()); Button button1 = (Button) conviewtView.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { // the button listener has a reference to an item in the list // so it can know its position in the ListView int i = getPosition(d); Toast.makeText(getContext(), "" + i, Toast.LENGTH_LONG).show(); remove(d); } }); return conviewtView; } } }); class DoubleAdapter extends ArrayAdapter<Double> { public DoubleAdapter(Context context, List<Double> list) { super(context, android.R.layout.simple_list_item_1, list); } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { if (conviewtView == null) { conviewtView = LayoutInflater.from(getContext()).inflate(R.layout.item_row, null); } // keep a reference to an item in a list final Double d = getItem(position); TextView lblId = (TextView) conviewtView.findViewById(R.id.lblId); lblId.setText(d.toString()); Button button1 = (Button) conviewtView.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { // the button listener has a reference to an item in the list // so it can know its position in the ListView int i = getPosition(d); Toast.makeText(getContext(), "" + i, Toast.LENGTH_LONG).show(); remove(d); } }); return conviewtView; } } 

    Pode valer a pena considerair se você precisa de editair texts paira serem airmazenados nas células da list? Pairece um pouco desnecessário quando o user só estairá editando um de cada vez.

    Embora eu não saiba como o seu aplicativo foi projetado, eu recomendairia repensair a experiência do user um pouco paira que, quando um item da list for pressionado, uma edição de text único é exibida paira serem editadas. Dessa forma, você pode simplesmente obter os itens da list como você normalmente fairia com um adaptador de list, airmazená-lo enquanto o user estiview editando e atualizá-lo quando tiviewem terminado.

    Não tenho certeza se esse é um design legal que você tenha, pois o conteúdo do EditText terá boas chances de ter problemas (bairalhair conteúdo, text faltando), uma vez que o seu listview seja rolado. considere experimentair a idéia do m6tt.

    mas se você quiser realmente seguir seu path, você pode postair algum código, especificamente do seu TextWatcher?

    Eu tentei resolview isso e, como você pode view, há um método simples – eu estou postando a resposta aqui, pois pode ser útil paira alguém.

    Não é possível obter a position quando a exibição de list -> editair text tem um observador de text.

    Esta é a solução que funcionou paira mim:

    Em get view –

    Quando adiciono o ouvinte observador de text paira editair text, adicionei também a linha abaixo

     edittext.setTag(R.id.position<any unique string identitiy>, position) 

    em seu afterTextChanged –

      int position = edittext.getTag(R.id.position) 

    Dá o número de position correto e você pode fazer modificações com base no número da position.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.