导航抽屉AsyncTask

时间:2015-08-13 08:35:56

标签: android listview android-fragments android-listview android-asynctask

我想揭露我的问题,我想知道如何解决它。 在我的应用程序中,我使用活动,进行简单登录,启动asyncTask。在此任务结束时,用户被重定向到另一个活动,这是应用程序的主页活动。后者的任务是管理导航抽屉及其碎片。必须使用从服务器检索的数据填充每个片段的内容,并且导航抽屉设置默认片段F1,该片段在用户登录后显示。 现在的问题是:

如何恢复填充fragment1中包含的listView所需的数据?

我知道如何为listView实现适配器,但我不了解如何使用片段F1传达家庭活动。我的意图是检索循环对话框(F1中的内容)并运行它,只要适配器所需的数据尚未恢复。

这里有一些代码:

public class LoginActivity extends ActionBarActivity {

     private Button loginButton;    
     private ProgressDialog progressDialog;   

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

        loginButton = (Button) findViewById(R.id.login_button);
        loginButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 new Login().execute();
             }
         }; 
     }

        @Override
     public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
     }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
     }

     private class Login extends AsyncTask<Void, Void, Void> {

         @Override
         protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(LoginActivity.this);
            progressDialog.setMessage("Login");
            progressDialog.setCancelable(false);
            progressDialog.show();
         }

         @Override
         protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            if (progessDialog.isShowing()) {
                progressDialog.dismiss();
            }
            Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
            Bundle bundle = new Bundle();
            intent.putExtras(bundle);
            startActivity(intent);
        }

        @Override
        protected Void doInBackground(String... params) {
           // code to retrieve data. 
        }
     }
}

public class HomeActivity extends ActionBarActivity implements FragmentDrawer.FragmentDrawerListener {

   private Toolbar toolbar;
   private FragmentDrawer fragmentDrawer;

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

       toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setDisplayShowHomeEnabled(false);

       fragmentDrawer = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
       fragmentDrawer.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
       fragmentDrawer.setDrawerListener(this);

       // Here the problem!!!
       displayView(0);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.menu_home, menu);
      return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if (id == R.id.action_settings) {
          return true;
      }

      return super.onOptionsItemSelected(item);
   }

   private void displayView(int position) {
       switch (position) {
           case 0:
               Fragment fragmentOne = new FragmentOne();
               move(matchFragment);
               break;
           case 1:
               Fragment fragmentTwo = new FragmentTwo();
               move(teamFragment);
               break;
           case 2:
               Fragment fragmentThree = new FragmentThree();
               move(myTeamFragment);
               break;
           case 3:
                //other fragment....
        default:
            break;
      }
   }

   public void move (Fragment fragment) {
       if (fragment != null) {
           FragmentManager fragmentManager = getSupportFragmentManager();
           FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
           fragmentTransaction.replace(R.id.container_body, fragment, fragment.getClass().getSimpleName());
           fragmentTransaction.commit();
       }
   }

   @Override
   public void onDrawerItemSelected(View view, int position) {
      displayView(position);
   }
}

public class FragmentOne extends Fragment {

    private ListView listView;
    private ArrayList<Info> infos; 
    private InfoAdapter infoAdapter;  

    public FragmentOne() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_match, container, false);

        listView = (ListView) rootView.findViewById(R.id.match_list_view);

        return rootView;
    }
}

现在,我在哪里实现AsyncTask来检索适配器的数据?在片段或活动? 如果它是Activity,我怎样才能恢复片段的视图元素?

提前致谢并抱歉英语不好。

1 个答案:

答案 0 :(得分:0)

第一个问题:

  

我不明白如何与家庭活动沟通   片段F1

您可以通过传递给Fragment构造函数的参数将HomeActivity中的信息传递给Fragment。因此,您可以调用Fragment fragmentOne = new FragmentOne();而不是Fragment fragmentOne = new FragmentOne(A a);,其中a是您要传递给片段的数据。当然,您需要在构造函数中添加带有Fragment类的参数。

第二点:

  

现在,我在哪里实现AsyncTask来检索适配器的数据?   在片段或活动?如果是活动,我该怎么办   恢复片段视图的元素?

你可以在onCreate()中调用AsynchTask来加载listView等的数据。我更喜欢的另一个选择是使用装载机。请参阅此处有关装载机的文档http://developer.android.com/guide/components/loaders.html。它也有一个例子。

有关说明和示例,您可以按照以下4部分教程进行操作: http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html