(Android) Общее предпочтение: как я могу отфильтровать список с результатом, полученным из общего предпочтения

Это то, что я получил от общего предпочтения,

 ApplicationInfo {1622e954 com.example.user.example}, ApplicationInfo {1aed20fd com.example.browhistlog} 

Любая идея, что шестнадцатеричный относится к? Можно ли отфильтровать список в приложении 2 на основе информации, которую я получил? Если возможно, что я могу сделать, чтобы достичь этого (любые ссылки)?


;

ListView myList;
Button getChoice, clearAll, selectAll;
SharedPreferences sharedpreferences;
public static final String MyPREFERENCES = "MyUserChoice" ;
ArrayList<String> selectedItems = new ArrayList<String>();    
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myList = (ListView)findViewById(android.R.id.list);
    getChoice = (Button)findViewById(R.id.getchoice);
    clearAll = (Button)findViewById(R.id.clearall);
    selectAll = (Button)findViewById(R.id.selectall);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice);
    myList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    myList.setAdapter(adapter);
    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    if(sharedpreferences.contains(MyPREFERENCES)){
        LoadSelections();
    }

    getChoice.setOnClickListener(new Button.OnClickListener() {


        @Override
        public void onClick(View v) {

            String selected = "";
            int cntChoice = myList.getCount();

            SparseBooleanArray sparseBooleanArray = myList.getCheckedItemPositions();
            for (int i = 0; i < cntChoice; i++) {
                if (sparseBooleanArray.get(i)) {
                    selected += myList.getItemAtPosition(i).toString() + "\n";
                    System.out.println("Checking list while adding:" + myList.getItemAtPosition(i).toString());
                    SaveSelections();
                }

            }

            Toast.makeText(MainActivity.this, selected, Toast.LENGTH_LONG).show();

        }
    });

    clearAll.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ClearSelections();
        }
    });

    selectAll.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            SelectAllSelections();
        }
    });

    packageManager = getPackageManager();

    new LoadApplications().execute();
   }
private void SaveSelections() {
// save the selections in the shared preference in private mode for the user

    SharedPreferences.Editor prefEditor = sharedpreferences.edit();
    String savedItems = getSavedItems();
    prefEditor.putString(MyPREFERENCES.toString(), savedItems);
    prefEditor.commit();
}

private String getSavedItems() {
    String savedItems = "";
    int count = this.myList.getAdapter().getCount();
    for (int i = 0; i < count; i++) {
        if (this.myList.isItemChecked(i)) {
            if (savedItems.length() > 0) {
                savedItems += "," + this.myList.getItemAtPosition(i);
            } else {
                savedItems += this.myList.getItemAtPosition(i);
            }
        }
    }
    return savedItems;
}

private void LoadSelections() {
// if the selections were previously saved load them

    if (sharedpreferences.contains(MyPREFERENCES.toString())) {

        String savedItems = sharedpreferences.getString(MyPREFERENCES.toString(), "");
        selectedItems.addAll(Arrays.asList(savedItems.split(",")));

        int count = this.myList.getAdapter().getCount();

        for (int i = 0; i < count; i++) {
            String currentItem = (String) myList.getAdapter()
                    .getItem(i);
            if (selectedItems.contains(currentItem)) {
                myList.setItemChecked(i, true);
                Toast.makeText(getApplicationContext(),
                        "Current Item: " + currentItem,
                        Toast.LENGTH_LONG).show();
            } else {
                myList.setItemChecked(i, false);
            }

        }
    }
}

private void ClearSelections() {
// user has clicked clear button so uncheck all the items
    int count = this.myList.getAdapter().getCount();
    for (int i = 0; i < count; i++) {
        this.myList.setItemChecked(i, false);
    }
// also clear the saved selections
    SaveSelections();
}

private void SelectAllSelections() {
// user has clicked clear button so uncheck all the items
    int count = this.myList.getAdapter().getCount();
    for (int i = 0; i < count; i++) {
        this.myList.setItemChecked(i, true);
    }
// also clear the saved selections then uncomment the below line.
// SaveSelections();
}

protected void onListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);

    ApplicationInfo app = applist.get(position);

    try{
        Intent intent = packageManager.getLaunchIntentForPackage(app.packageName);

        /*if(intent != null){
            startActivity(intent);
        }*/
    }catch(ActivityNotFoundException e){
        Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();
    }catch(Exception e){
        Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list){
    ArrayList<ApplicationInfo> appList = new ArrayList<ApplicationInfo>();
    for(ApplicationInfo info : list){
        try{
            if(packageManager.getLaunchIntentForPackage(info.packageName)!=null){
                appList.add(info);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    return appList;
}

private class LoadApplications extends AsyncTask<Void, Void, Void>{
    private ProgressDialog progress = null;

    protected Void doInBackground(Void... params){
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        listadapter = new AppAdapter(MainActivity.this, R.layout.activity_list_app, applist);
        return null;
    }
    protected void onPostExecute(Void result){
        setListAdapter(listadapter);
        progress.dismiss();
        super.onPostExecute(result);
    }
    protected void onPreExecute(){
        progress = ProgressDialog.show(MainActivity.this, null, "Loading apps info...");
        super.onPreExecute();
    }
}
}

1 ответ

В вашем случае я бы использовал DataBase вместо SharedPreferences, но если вы все равно предпочитаете это, я бы использовал другой подход. Перейдите по списку и сохраните каждую строку отдельно, с некоторым индексом.

int i = 0;
sharedPreferences.putInt("list_size", selectedItems.size());
for(String s: selectedItems) {
    sharedPreferences.putString("item_" + i, );
    i++;
}

То же самое для чтения

int readSize = sharedPreferences.getInt("list_size", 0);
for(int i = 0; i < readSize; i++) {
    myList.add(sharedPreferences.getString("item_" + 1, null);
}

Это может быть решением для строки. Если у вас есть объекты, рассмотрите базу данных или сериализацию события в файле.

PS То, что вы читаете при сохранении всего списка, является своего рода внутренним хеш-индексом. Итак, вы сохраняете представление списка, созданного функцией toString(). Это не обязательно правильное представление.

Другие вопросы по тегам