El contenido favorito no se muestra correctamente en webview

91

Estoy desarrollando una aplicación de diccionario de idiomas. Guardo la palabra favorita en Preferencia. El contenido favorito del archivo XML tiene el siguiente aspecto:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  <map>
    <string name="history">
      dict_name::160170::hi,dict_name::157140::he-man,dict_name::184774::jet,dict_name::34527::black
    </string>
    <string name="waitingTime">
      0
    </string>
    <boolean name="saveFavourite" value="true" />
    <string name="defaultDictionary">
      dict_name
    </string>
    <string name="favourite">
      dict_name::149271::go,dict_name::25481::back,dict_name::184774::jet
    </string>
    <boolean name="saveHistory" value="true" />
  </map>

Utilizo el siguiente código para cargar el contenido favorito en la vista web:

public class User extends Activity {
    private static final String FAVOURITE_TAG = "[MyDict - FavouriteView] ";
    private static final String CONTENT_TAG = null;

    private ListView mLSTFavourite = null;
    private ArrayList<String> lstDict = null;
    private ArrayList<Integer> lstId = null;
    private ArrayList<String> mWordFavourite = null;
    private ArrayAdapter<String> aptList = null;
    private SharedPreferences prefs;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.favourite);
        prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        if (prefs.getBoolean("saveFavourite", true)) {
            String strFavourite = prefs.getString("favourite", "");
            Log.i(FAVOURITE_TAG, "Favourite loaded");
            if (strFavourite != null && !strFavourite.equals("")) {
                mWordFavourite = new ArrayList<String>(Arrays.asList(strFavourite.split(",")));
            } else {
                mWordFavourite = new ArrayList<String>();
            }
        } else {
            mWordFavourite = new ArrayList<String>();
        }

        Log.d(FAVOURITE_TAG, "mWordFavourite = " + mWordFavourite.size());
        mLSTFavourite = (ListView) findViewById(R.id.lstFavourite);

        ImageButton btnClear = (ImageButton) findViewById(R.id.btnClear);
        ImageButton btnBackToContent = (ImageButton) findViewById(R.id.btnBackToContent);

        if (lstDict == null) {
            lstDict = new ArrayList<String>();
            lstId = new ArrayList<Integer>();
            aptList = new ArrayAdapter<String>(getApplicationContext(), R.layout.customlist);
        }
        lstDict.clear();
        lstId.clear();
        aptList.clear();

        if (mWordFavourite != null && mWordFavourite.size() > 0) {
            try {
                for (int i = 0; i < mWordFavourite.size(); i++) {
                    Log.i(FAVOURITE_TAG, "item = " + mWordFavourite.get(i));
                    String arrPart[] = mWordFavourite.get(i).split("::");
                    if (arrPart.length == 3) {
                        Log.i(CONTENT_TAG, "loaded content " + arrPart.length + ", wordId = " + arrPart[1]);
                        // Log.i(CONTENT_TAG, "loaded 0");
                        lstDict.add(i, arrPart[0]);
                        // Log.i(CONTENT_TAG, "loaded 1");
                        lstId.add(i, Integer.parseInt(arrPart[1]));
                        // Log.i(CONTENT_TAG, "loaded 2");
                        aptList.add(arrPart[2]);
                    } else {
                        Log.i(FAVOURITE_TAG, "Wrong entry: " + mWordFavourite.get(i));
                    }
                }
            } catch (Exception ex) {
                Log.i(FAVOURITE_TAG, "Wrong entry found!");
            }
        }
        // Log.i(CONTENT_TAG,"Adapter size = " + aptList.getCount());
        // assign result return
        mLSTFavourite.setAdapter(aptList);
        mLSTFavourite.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> arg0, View v, int arg2, long arg3) {
                        // mEDWord.setText(mAdapter.getItem(arg2));
                        Intent i = new Intent();
                        i.putExtra("dict", lstDict.get(arg2));
                        i.putExtra("wordId", lstId.get(arg2));
                        setResult(RESULT_OK, i);
                        finish();
                    }
                });
        btnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mWordFavourite.clear();
                aptList.clear();
                mLSTFavourite.setAdapter(aptList);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString("favourite", "");
                editor.commit();
                setResult(RESULT_OK);
                finish();
            }
        });

        btnBackToContent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_CANCELED);
                finish();
            }
        });
    }
}

El contenido favorito se cargó correctamente. Las palabras favoritas se enumeran en la vista web. Pero el problema es que solo muestra la definición de la última palabra agregada al Favorito, independientemente de la palabra elegida. Por ejemplo:

word1
word2
word3

A pesar de que se selecciona palabra1 y / o palabra2 por su significado, siempre se muestra la definición de la última palabra, que es palabra3. Mi propósito es mostrar la definición de word1cuándo word1se selecciona y la definición de word2cuándo word2se selecciona, y así sucesivamente. Guardo los datos de mi diccionario en la base de datos SQLite.

¿Alguien puede ayudar a resolver este problema?

Niamh Doyle
fuente
18
Probé el código en su pregunta y, en la medida de lo posible, parece devolver el nombre correcto del diccionario y la identificación de la palabra de sus datos de muestra cuando se selecciona uno de ellos en la vista de lista. Menciona una vista web y una base de datos, que presumiblemente obtienen y muestran los datos de la palabra seleccionada, se podría brindar más ayuda si se proporcionaran algunos detalles de estos.
StevieB
6
¿Qué versión de Android estás usando aquí? 2.3 tiene problemas con las preferencias de acciones, me las he encontrado yo mismo, y esto suena como un efecto familiar.
nebulosas
5
En el título mencionas webview, ¿dónde está WebView en tu código?
Puntero nulo
2
Como ya mencionó @StevieB; es un poco difícil dar una ayuda más precisa sin ver el código relacionado con WebView. Espontáneamente puedo pensar en los datos de almacenamiento en caché de WebView bajo ciertas circunstancias. Pero nuevamente: realmente necesitaría ver cómo implementa la parte WebView para poder brindar ayuda más detallada.
dbm
2
¡Qué pregunta tan loca! ¿Resucitado 8 meses después del hecho, todavía sin el código relevante publicado y de alguna manera con un +74? Esto no está bien investigado ni es más útil que este comentario.
dokkaebi

Respuestas:

3

Creo que el problema viene de esta linea

            mWordFavourite = new ArrayList<String>(Arrays.asList(strFavourite.split(",")));

donde crea un nuevo <string>objeto ArrayList cada vez, pero debe agregarlo? y obtén el último, de lo contrario deberías ponerlo en una variable

Si está comprobando si su tamaño ()> 0

Pero cada vez que crea un nuevo objeto que no se le agrega

¡Tal vez yo estoy equivocado!

ucefkh
fuente