【发布时间】:2014-04-30 23:27:33
【问题描述】:
在我的课堂上有各种AutoCompleteTextView,它们都有相同的ArrayAdapter作为提示。此文本视图用于通过AsyncTask 将数据发送到 php 页面,并在他的doInBackground 方法中检查插入的值是否是适配器中包含的值之一(我不想接受任何其他值价值)。对于这个检查,我只是做:
if(fermate.getPosition(fermata) < 0){
return "lineaNonPresente"; // It is returned to onPostExecute
}
在这段代码中,fermate 是 ArrayAdapter,fermata 是不应在适配器中找到的字符串。如果没有找到,我返回一个 String 结尾 doInBackground。
有什么问题?问题是对象fermate。当我检查 ArrayAdapter 时不再包含原始值,而只是其中的一些。我在调试期间通过观察这个变量看到了它。进入 fermate 有一个数组 mObjets 包含
[Via Roma - Cod: 2, San Rocco - Cod: 4, null, null, null, null, null, null, null, null, null, null]
还有一个数组mOriginalValues,其中包含
[Piazza Torino - Cod: 1, Via Roma - Cod: 2, Corso Nizza - Cod: 3, San Rocco - Cod: 4, Crocetta - Cod: 5, Provincia - Cod: 6, Municipio - Cod: 7, Piazzale Serenella - Cod: 9, FermataLocale - Cod: 16, Mi Serve - Cod: 17]
(所有应该进入fermate的元素)。
当我创建适配器时,mObject 包含[Piazza Torino - Cod: 1, Via Roma - Cod: 2, Corso Nizza - Cod: 3, San Rocco - Cod: 4, Crocetta - Cod: 5, Provincia - Cod: 6, Municipio - Cod: 7, Piazzale Serenella - Cod: 9, FermataLocale - Cod: 16, Mi Serve - Cod: 17] 而mOriginalValues 为空。
所以我的问题有两个:
- 为什么在
AsyncTask中包含在ArrayAdapter中的值会发生变化? - 我怎样才能使方法
getPosition()搜索到mOriginalValues?或者这样做是为了使数组mObjects不会受到不受控制的更改的影响?
我让全班的代码来帮忙。
package com.example.app.Fragment;
imports [...]
public class FragmentAggiungiLinea extends Fragment {
private Context context;
private LayoutInflater li;
private Button btnNuovaFermata;
private Button btnEliminaFermata;
private Button btnConfermaLinea;
private AutoCompleteTextView primaFermata;
private EditText edtNomeLinea;
private EditText edtCodiceLinea;
private LinearLayout layoutBase;
private ArrayAdapter<String> fermate;
@SuppressWarnings("unused")
private static final String TAG = FragmentAggiungiLinea.class.getSimpleName();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_aggiungi_linea, container, false); }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
context = getActivity();
li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
btnEliminaFermata = (Button) getView().findViewById(R.id.btnEliminaFermata);
btnNuovaFermata = (Button) getView().findViewById(R.id.btnNuovaFermata);
btnConfermaLinea = (Button) getView().findViewById(R.id.btnConfermaLinea);
layoutBase = (LinearLayout) getView().findViewById(R.id.layoutBase);
primaFermata = (AutoCompleteTextView) getView().findViewById(R.id.edtPrimaFermata);
edtNomeLinea = (EditText) getView().findViewById(R.id.edtNomeLinea);
edtCodiceLinea = (EditText) getView().findViewById(R.id.edtCodiceLinea);
fermate = new ArrayAdapter<String>(context,android.R.layout.simple_dropdown_item_1line);
creaAdapter();
primaFermata.setAdapter(fermate);
btnNuovaFermata.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(!((EditText)((LinearLayout) layoutBase.getChildAt(layoutBase.getChildCount() - 1)).getChildAt(1)).getText().toString().matches("")){
LinearLayout nuovoLayout = (LinearLayout) li.inflate(R.layout.nuova_fermata_intermedia, null);
// I get the new EditText and I put the adapter.
AutoCompleteTextView nuovaFermata = (AutoCompleteTextView) nuovoLayout.getChildAt(1);
nuovaFermata.setAdapter(fermate);
layoutBase.addView(nuovoLayout);
btnEliminaFermata.setEnabled(true);
}else{
Toast.makeText(context, "Completare prima l'ultima fermata", Toast.LENGTH_SHORT).show();
}
}
});
btnEliminaFermata.setEnabled(false);
btnEliminaFermata.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
layoutBase.removeViewAt(layoutBase.getChildCount() - 1);
if(layoutBase.getChildCount() == 1) btnEliminaFermata.setEnabled(false);
}
});
btnConfermaLinea.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(!edtCodiceLinea.getText().toString().matches(""))
if(!edtNomeLinea.getText().toString().matches(""))
new UploadLinea().execute();
}
});
}
private void creaAdapter(){
// I create an adapter with the stops.
fermate.clear();
// I get the local database.
DatabaseLocale db = new DatabaseLocale(context);
SQLiteDatabase dbLeggibile = db.getReadableDatabase();
String[] colonne = {DatabaseLocale.getTagCodiceFermata(), DatabaseLocale.getTagNomeFermata()};
String tabella = DatabaseLocale.getTableNameFermata();
Cursor cursore = dbLeggibile.query(tabella, colonne, null, null, null, null, null);
while(cursore.moveToNext()){
fermate.add(cursore.getString(1) + " - Cod: " + cursore.getString(0));
}
cursore.close();
db.close();
}
class UploadLinea extends AsyncTask<Void, Void, String>{
private ProgressDialog pDialog;
@SuppressWarnings("unused")
private final String TAG = UploadLinea.class.getSimpleName();
private String NUOVA_LINEA;
List<NameValuePair> params = null;
JSONObject json = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Caricamento linea...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
NUOVA_LINEA = GlobalClass.getDominio() + "Upload/caricaLinea.php";
}
protected String doInBackground(Void... voids) {
String valoreRitornato = null;
JSONParser jsonParser = new JSONParser();
try {
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("NomeLinea", edtNomeLinea.getText().toString()));
params.add(new BasicNameValuePair("CodLinea", edtCodiceLinea.getText().toString()));
int indice = 0;
while(indice < layoutBase.getChildCount()){
LinearLayout layoutFermata = (LinearLayout) layoutBase.getChildAt(indice);
String fermata = ((AutoCompleteTextView) layoutFermata.getChildAt(1)).getText().toString();
if(fermate.getPosition(fermata) < 0){ // HERE THERE IS THE PIECE OF CODE
return "lineaNonPresente";
}
if(trovatoInArrayList(fermata.split(" - Cod: ")[1])){
return "giaPresente";
}
params.add(new BasicNameValuePair("Fermate[]", fermata.split(" - Cod: ")[1]));
indice++;
}
// Request to the .php page.
json = jsonParser.makeHttpRequest(
NUOVA_LINEA, "POST", params);
valoreRitornato = json.getString(GlobalClass.getTagMessage());
} catch (JSONException e) {
Log.e(TAG, "Error " + e.toString());
}
return valoreRitornato;
}
@Override
protected void onPostExecute(String valoreRitornato) {
super.onPostExecute(valoreRitornato);
pDialog.dismiss();
if(valoreRitornato == "giaPresente"){
valoreRitornato = "Ogni fermata può essere inserita una volta soltanto.";
} else if(valoreRitornato == "lineaNonPresente"){
valoreRitornato = "Le linee devono avere uno dei valori suggeriti.";
}else{
try {
if(json.getInt(GlobalClass.getTagSuccess()) != 0){
DatabaseLocale db = new DatabaseLocale(context);
SQLiteDatabase dbScrivibile = db.getWritableDatabase();
ContentValues valori = new ContentValues();
valori.put(DatabaseLocale.getTagCodiceLinea(), edtCodiceLinea.getText().toString());
valori.put(DatabaseLocale.getTagNomeLinea(), edtNomeLinea.getText().toString());
valori.put(DatabaseLocale.getTagCodiceCapolinea(),
((AutoCompleteTextView)((LinearLayout) layoutBase.getChildAt(0)).getChildAt(1)).getText().toString().split(" - Cod: ")[1]);
dbScrivibile.insert(DatabaseLocale.getTableNameLinea(), null, valori);
for (int i = 0; i < params.size(); i++) {
BasicNameValuePair valore = ((BasicNameValuePair) params.get(i));
if(valore.getName() == "Fermate[]" && i != (params.size() - 1)){
valori = new ContentValues();
valori.put(DatabaseLocale.getTagCodiceLinea(), edtCodiceLinea.getText().toString());
valori.put(DatabaseLocale.getTagCodiceFermata(), valore.getValue());
valori.put(DatabaseLocale.getTagSuccessiva(), ((BasicNameValuePair) params.get(i + 1)).getValue());
}else if(i == (params.size() - 1)){
valori = new ContentValues();
valori.put(DatabaseLocale.getTagCodiceLinea(), edtCodiceLinea.getText().toString());
valori.put(DatabaseLocale.getTagCodiceFermata(), valore.getValue());
valori.put(DatabaseLocale.getTagSuccessiva(), 0);
}
dbScrivibile.insert(DatabaseLocale.getTableNameTratta(), null, valori);
}
dbScrivibile.close();
db.close();
}
} catch (JSONException e) {
Log.e(TAG, "Error " + e.toString());
}
while(layoutBase.getChildCount() > 1) layoutBase.removeViewAt(layoutBase.getChildCount() - 1);
primaFermata.setText("");
edtCodiceLinea.setText("");
edtNomeLinea.setText("");
}
Toast.makeText(context, valoreRitornato, Toast.LENGTH_LONG).show();
Log.d(TAG, valoreRitornato);
}
private boolean trovatoInArrayList(String s){
for (NameValuePair elemento : params) {
if(elemento.getValue() == s) return true;
}
return false;
}
}
}
更新: 在调用 AsyncTask.execute() 之前,我尝试对 onClickListener 进行检查,但我遇到了同样的问题。代码的新部分是这样的:
btnConfermaLinea.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(!edtCodiceLinea.getText().toString().matches(""))
if(!edtNomeLinea.getText().toString().matches("")){
// Creo qui i parametri per risolvere il problema:
// http://stackoverflow.com/questions/23399793/arrayadapter-getposition-item-not-found-it-is-in-moriginalvalues
// (non ho ancora ricevuto risposte).
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("NomeLinea", edtNomeLinea.getText().toString()));
params.add(new BasicNameValuePair("CodLinea", edtCodiceLinea.getText().toString()));
int indice;
for(indice = 0; indice < layoutBase.getChildCount(); indice++){
LinearLayout layoutFermata = (LinearLayout) layoutBase.getChildAt(indice);
String fermata = ((AutoCompleteTextView) layoutFermata.getChildAt(1)).getText().toString();
if(trovatoInArrayList(fermata.split(" - Cod: ")[1])){
Toast.makeText(context, "Ogni fermata può essere inserita una volta soltanto.", Toast.LENGTH_LONG).show();
break;
}
if(fermate.getPosition(fermata) < 0){
Toast.makeText(context, "Le linee devono avere uno dei valori suggeriti.", Toast.LENGTH_LONG).show();
break;
}
params.add(new BasicNameValuePair("Fermate[]", fermata.split(" - Cod: ")[1]));
}if(indice == layoutBase.getChildCount())
new UploadLinea().execute();
}
}
});
【问题讨论】:
标签: android search android-asynctask runtime-error android-arrayadapter