Ancora nuovo per Android e ancor più per l'adattatore del cursore personalizzato, quindi ho difficoltà a capire come impedire che la mia listview ricicli le viste per impedire che l'input da un edittext venga visualizzato in un altro quando si scorre. Ho visto in un altro post che dice di cambiare il nome di convertview ma come farlo sto disegnando uno spazio vuoto. Speravo che qualcuno qui sarebbe stato in grado di fornire maggiori dettagli o esempi su come fare in base al codice che ho scritto finora.EditText in ListView senza il riciclaggio dell'ingresso
public class editview extends ListActivity {
private dbadapter mydbhelper;
private PopupWindow pw;
public static int editCount;
public static ListView listView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mydbhelper = new dbadapter(this);
mydbhelper.open();
View footer = getLayoutInflater().inflate(R.layout.footer_layout, null);
ListView listView = getListView();
listView.addFooterView(footer);
showResults();
}
//Populate view
private void showResults(){
Cursor cursor = mydbhelper.getUserWord();
startManagingCursor(cursor);
String[] from = new String[] {dbadapter.KEY_USERWORD};
int[] to = new int[] {R.id.textType};
ItemAdapter adapter = new ItemAdapter(this, R.layout.edit_row, cursor,
from, to);
adapter.notifyDataSetChanged();
this.setListAdapter(adapter);
editCount = adapter.getCount();
}
//footer button
public void onClick(View footer){
final MediaPlayer editClickSound = MediaPlayer.create(this, R.raw.button50);
editClickSound.start();
startActivity(new Intent("wanted.pro.madlibs.OUTPUT"));
}
//custom cursor adapter
class ItemAdapter extends SimpleCursorAdapter {
private LayoutInflater mInflater;
private Cursor cursor;
public ItemAdapter(Context context, int layout, Cursor cursor, String[] from,
int[] to) {
super(context, layout, cursor, from, to);
this.cursor = cursor;
mInflater = LayoutInflater.from(context);
}
static class ViewHolder {
protected TextView text;
protected EditText edittext;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.edit_row, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.textType);
holder.edittext = (EditText) convertView.findViewById(R.id.editText);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
cursor.moveToPosition(position);
int label_index = cursor.getColumnIndex("userword");
String label = cursor.getString(label_index);
holder.text.setText(label);
return convertView;
}
}
cambiato in
class ItemAdapter extends SimpleCursorAdapter {
private LayoutInflater mInflater;
private Cursor cursor;
Map<Integer, String> inputValues = new HashMap<Integer, String>();
public View getView(final int position, View convertView, ViewGroup parent) {
....
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.edit_row, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.textType);
holder.edittext = (EditText) convertView.findViewById(R.id.editText);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
cursor.moveToPosition(position);
int label_index = cursor.getColumnIndex("userword");
String label = cursor.getString(label_index);
holder.text.setText(label);
String oldText = inputValues.get(position);
holder.edittext.setText(oldText == null ? "" : oldText);
holder.edittext.addTextChangedListener(new TextWatcher(){
public void afterTextChanged(Editable editable) {
inputValues.put(position, editable.toString());
}
ma è il riciclo dopo tutto EditText disporre di dati. Ho provato a usare holder.edittext.setText (oldText) ma lo stesso effetto.
Stavo giocando con aftertextchange ma ho scoperto che non stava memorizzando i valori come volevo. IE memorizzerebbe solo parte della stringa in diverse parti della matrice. Potrei digitare qualcosa come dog nell'ultimo edittext e quando chiamerei le posizioni in ArrayList editTextList. Sembrerebbe pos1 cane pos2 do pos3 do. Non capivo perché si limitasse ad afferrare parte della stringa edittext. –
maebe
Le posizioni sembravano inaffidabili ma forse le stavo definendo male. Quando usavo un adattatore per semplice cursore, ho cambiato l'id di edittext via per loop e usavo quel ciclo per archiviarlo e chiamarli alla prossima attività. Ma ha ancora incontrato problemi di riciclaggio. Ho esaminato le hashmap ininterrottamente per le ultime due settimane, ma non riesco a trovare alcuna buona informazione che spieghi come usarle. Solo pezzi di codice qua e là. – maebe
// TextWatcher, salva i dati nell'array per un uso successivo. implementatore di classi implementa TextWatcher { posizione int privata; osservatore pubblico (posizione int) { this.position = position; } \t public void afterTextChanged (s modificabile) { \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t Log.e (String.valueOf (posizione), "è la posizione di int") ; \t Testo stringa = s.toString(); \t editview.editTextList.add (posizione, testo); È quello che mi è venuto in mente con il mio textwatcher – maebe