Le contenu favori ne s'affiche pas correctement sur la vue Web

91

Je développe une application de dictionnaire de langue. J'enregistre le mot préféré dans Préférence. Le contenu favori du fichier XML ressemble à ce qui suit:

<?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>

J'utilise le code suivant pour charger le contenu favori dans la vue 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();
            }
        });
    }
}

Le contenu favori est chargé avec succès. Les mots préférés sont répertoriés dans la vue Web. Mais le problème est qu'il ne montre que la définition du dernier mot ajouté au favori quel que soit le mot choisi. Par exemple:

word1
word2
word3

Bien que mot1 et / ou mot2 soit sélectionné pour la signification, la définition du dernier mot, qui est mot3, est toujours affichée. Mon but est d'afficher la définition de word1quand word1est sélectionné, et la définition de word2quand word2est sélectionné, et ainsi de suite. J'enregistre mes données de dictionnaire dans la base de données SQLite.

Quelqu'un peut-il aider à résoudre ce problème.

Niamh Doyle
la source
18
J'ai essayé le code dans votre question et dans la mesure où il va, il semble renvoyer le nom du dictionnaire correct et l'identifiant du mot à partir de vos exemples de données lorsque l'un d'eux est sélectionné dans la liste. Vous mentionnez une Webview et une base de données, qui obtiennent et affichent vraisemblablement les données pour le mot sélectionné, une aide supplémentaire pourrait être fournie si certains détails étaient fournis.
StevieB
6
quelle version d'Android utilisez-vous ici? 2.3 a des problèmes avec les préférences de partage, je les ai rencontrés moi-même, et cela ressemble à un effet familier.
nébuleuses du
5
Dans le titre, vous mentionnez webview, où est WebView dans votre code ???
Pointer Null
2
Tout comme @StevieB l'a déjà mentionné; il est un peu difficile de donner une aide plus précise sans voir le code associé à WebView. Spontanément, je peux penser aux données de mise en cache WebView dans certaines circonstances. Mais encore une fois: j'aurais vraiment besoin de voir comment vous implémentez la partie WebView pour pouvoir donner une aide plus détaillée.
dbm
2
Quelle question loufoque! Ressuscité 8 mois après les faits, toujours sans code pertinent affiché, et en quelque sorte avec un +74? Ce n'est pas bien documenté, ni plus utile que ce commentaire.
dokkaebi

Réponses:

3

Je pense que le problème vient de cette ligne

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

où vous créez un nouvel <string>objet ArrayList à chaque fois mais que vous devez y ajouter? & obtenir le dernier sinon vous devriez le mettre dans une variable

Si vous vérifiez si sa taille ()> 0

Mais chaque fois que vous créez un nouvel objet sans y ajouter

Peut-être que je me trompe!

ucefkh
la source