Как обновить просмотр списка во фрагменте без перезапуска приложения? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть фрагмент с ListView, в котором перечислены несистемные приложения, работающие в фоновом режиме.Я хочу, чтобы это обновлялось по мере запуска и закрытия новых приложений.Я не уверен, как бы я применил другие ответы, поэтому я решил спросить.

Основная активность

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

private final Fragment mTimerFragment = new TimerFragment();
private final Fragment mListFragment = new ListFragment();
private final Fragment mReminderFragment = new RemindFragment();

private Fragment mActiveFragment = mTimerFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().beginTransaction()
        .add(R.id.fragContainer, mReminderFragment, "TimerFragment")
        .hide(mReminderFragment)
        .commit();

        getSupportFragmentManager().beginTransaction()
        .add(R.id.fragContainer, mListFragment, "ListFragment")
        .hide(mListFragment)
        .commit();

        getSupportFragmentManager().beginTransaction()
        .add(R.id.fragContainer, mTimerFragment, "ReminderFragment")
        .commit();

        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(this);
        }

public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {

        case R.id.navigation_home:
        getSupportFragmentManager().beginTransaction()
        .hide(mActiveFragment)
        .show(mTimerFragment)
        .commit();
        mActiveFragment = mTimerFragment;
        return true;

        case R.id.navigation_dashboard:
        getSupportFragmentManager().beginTransaction()
        .hide(mActiveFragment)
        .show(mListFragment)
        .commit();
        mActiveFragment = mListFragment;
        return true;

        case R.id.navigation_notifications:
        getSupportFragmentManager().beginTransaction()
        .hide(mActiveFragment)
        .show(mReminderFragment)
        .commit();
        mActiveFragment = mReminderFragment;
        return true;
        }

        return false;
        }
        }

Я использую нижнюю навигацию с тремяфрагменты.Фрагмент, о котором идет речь, такой:

Фрагмент

public class ListFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag_list,null);
        ListView list1 = (ListView)view.findViewById(R.id.listview1);
        ActivityManager am = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
        PackageManager packageManager = getActivity().getPackageManager();

        List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
        final String pnArr[] = new String[runningAppProcessInfo.size()];
        List<String> filteredApps = new ArrayList<>();
        List<String> filteredRunningApps = new ArrayList<>();
        List<String> appNames = new ArrayList<>();

        //user-apps loop
        List<PackageInfo> apps = getActivity().getPackageManager().getInstalledPackages(0);
        for (int i = 0; i < apps.size(); i++){
            if ((apps.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 1){
                filteredApps.add(apps.get(i).packageName);
            }
        }

        //running apps + comparison loop
        for (int i = 0; i < runningAppProcessInfo.size(); i++) {
            pnArr[i] = runningAppProcessInfo.get(i).processName;
            if (filteredApps.contains(runningAppProcessInfo.get(i).processName)) {
                filteredRunningApps.add(runningAppProcessInfo.get(i).processName);
            }
        }

        //package name -> app name conversion
        for (int i = 0; i < filteredRunningApps.size();i++) {
            ApplicationInfo ai = null;
            try{
                ai = packageManager.getApplicationInfo(filteredRunningApps.get(i),0);

            }catch (PackageManager.NameNotFoundException e){}
            String title = (String)((ai != null) ? packageManager.getApplicationLabel(ai) : "???");
            appNames.add(title);
        }

        Toast.makeText(getActivity(), "Filtered Apps : " + filteredApps.size() + " | Running Apps : " + runningAppProcessInfo.size() + " | Filtered Running Apps : " + filteredRunningApps.size(), Toast.LENGTH_LONG).show();

         ArrayList<String> pnList = new ArrayList<String>();
         pnList.addAll(Arrays.asList(pnArr));
         ArrayAdapter<String> aa = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,appNames);
         list1.setAdapter(aa);

        return view;
    }
}

Сейчас он работает так, как получает список при запуске приложения, но так и остается.пока приложение не будет перезапущено и список не заполнится новыми значениями.Любая идея, как сделать его обновить, когда приложения в фоновом режиме закрыты / открыты?

1 Ответ

0 голосов
/ 28 марта 2019

Вы можете вызвать notifyDataSetChanged() на вашем адаптере при обновлении данных.

Так что в вашем случае это будет после этой строки

  appNames.add(title);

Вы добавите это

  aa.notifyDataSetChanged()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...