0

У меня есть приложение, в котором первая активность является страницей входа. Когда пользователь успешно входит в систему, он видит свои проекты. Я использую ListFragment, чтобы просмотреть этот список (поскольку у меня также есть публичные проекты, которые пользователь видит в половине страницы входа). И я добавляю навигационный ящик к активности после входа в систему. После большой путаницы я смог добавить ящик навигации в действие, но у него есть пустой список.Навигационный ящик ListView пуст

DrawerActivity.java:

public class DrawerActivity extends Activity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mScreenTitles; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.private_project_list); 
    mTitle = mDrawerTitle = getTitle(); 
    mScreenTitles = getResources().getStringArray(R.array.screen_titles); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.left_drawer); 

    mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
      R.layout.drawer_list_item, mScreenTitles)); 
    //mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    // ActionBarDrawerToggle ties together the the proper interactions 
    // between the sliding drawer and the action bar app icon 
    mDrawerToggle = new ActionBarDrawerToggle(
      this,     /* host Activity */ 
      mDrawerLayout,   /* DrawerLayout object */ 
      R.drawable.ic_navigation_drawer, /* nav drawer image to replace 'Up' caret */ 
      R.string.drawer_open, /* "open drawer" description for accessibility */ 
      R.string.drawer_close /* "close drawer" description for accessibility */ 
    ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     selectItem(0); 
    } 
} 

/* Called whenever we call invalidateOptionsMenu() */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // If the nav drawer is open, hide action items related to the content view 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // The action bar home/up action should open or close the drawer. 
    // ActionBarDrawerToggle will take care of this. 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

/* The click listner for ListView in the navigation drawer */ 
private class DrawerItemClickListener implements ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     selectItem(position); 
    } 
} 

private void selectItem(int position) { 

    } 
} 

PrivateProjectListActivity.java: (который расширяет DrawerActivity)

public class PrivateProjectListActivity extends DrawerActivity { 
private final static String TAG_TITLE = "title"; 
private final static String TAG_ANIM_ARRAY_ID = "animation_array"; 
private final static String TAG_PROJECTS = "projects"; 
private final static String TAG_ID = "id"; 

JSONArray projects = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.private_project_list); 
    new HttpGetHandler().execute(); 
} 

private class HttpGetHandler extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     String jsonUrl = "http://canvasflip.com/protected/actions/user.php?action=get-projects&network=Escort&index=0&count=100"; 
     HttpGet httpGet = new HttpGet(jsonUrl); 
     try { 
      HttpResponse httpResponse = MainActivity.httpClient.execute(httpGet); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      InputStream content = httpEntity.getContent(); 
      String result = convertToString(content); 
      JSONObject jsonObject = new JSONObject(result); 
      projects = jsonObject.getJSONArray(TAG_PROJECTS); 
      PrivateProjectListActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        try{ 
         ArrayList<String> projectTitle = new ArrayList<String>(); 
         ArrayList<String> imageId = new ArrayList<String>(); 
         ArrayList<String> playId = new ArrayList<String>(); 
         for(int i=0; i<projects.length(); i++) { 
          JSONObject p = projects.getJSONObject(i); 
          String title = p.getString(TAG_TITLE); 
          String id = p.getString(TAG_ID); 
          String array_anim_id = p.getString(TAG_ANIM_ARRAY_ID); 
          String imgId = array_anim_id.substring(0, 4); 
          projectTitle.add(title); 
          imageId.add(imgId); 
          playId.add(id); 
         } 
         String[] arrProjectTitle = new String[projectTitle.size()]; 
         String[] arrImageId = new String[imageId.size()]; 
         final String[] pid = new String[playId.size()]; 
         for(int i = 0; i<projectTitle.size(); i++) 
          arrProjectTitle[i] = projectTitle.get(i); 
         for(int j = 0; j<imageId.size(); j++) 
          arrImageId[j] = imageId.get(j); 
         for(int k = 0; k<playId.size(); k++) 
          pid[k] = playId.get(k); 

         Bundle b = new Bundle(); 
         b.putStringArray("projectTitle", arrProjectTitle); 
         b.putStringArray("imageId", arrImageId); 
         PrivateProjectsListFragment fragment = new PrivateProjectsListFragment(); 
         fragment.setArguments(b); 

         FragmentManager fm = getFragmentManager(); 
         FragmentTransaction ft = fm.beginTransaction(); 
         ft.replace(R.id.privateProjectsContainer,fragment); 
         ft.commit(); 
        }catch(Exception e) { 

        } 
       } 
      }); 
     }catch(Exception e) { 
     } 
     return null; 
    } 

    public String convertToString(InputStream inputStream) throws IOException { 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = ""; 
     String result = ""; 
     while((line = bufferedReader.readLine())!=null) { 
      result += line; 

     } 
     inputStream.close(); 
     return result; 
     } 
    } 
} 

private_project_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
android:layout_height="match_parent" 
android:layout_width="match_parent" 
android:id="@+id/drawer_layout" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="match_parent" 
android:id="@+id/privateProjectsContainer" 
android:background="#eeeeee"> 


</FrameLayout> 

<ListView 
    android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#111"/> 
    </android.support.v4.widget.DrawerLayout> 

Плюс, кнопка переключения также не работает. Я вижу только стрелку назад, и ничего не происходит при нажатии на нее, я должен скользить слева, чтобы открыть ящик.

+0

Я думаю, когда вы расширяете деятельность, как этот первый private_project_list макет получит заменяется вторым расположением. – sachithkn

+0

@ user2217535 то как мне это сделать? –

+0

Я думаю, вы можете поместить новый HttpGetHandler(). Execute(); в DrawerActivity, нет необходимости в двух классах – sachithkn

ответ

2

я предлагаю вам сделать это как следующее:

В DrawerActivity, создать только навигационный ящик, без использования onCreate(), но с использованием onStart(). onCreate() будет называться в деятельности, которая простирается DrawerActivity и там вы будете называть setContentView

Ваш класс будет выглядеть так:

public class DrawerActivity extends Activity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mScreenTitles; 

@Override 
    protected void onStart(){ 
     super.onStart(); 
     mTitle = mDrawerTitle = getTitle(); 
     mScreenTitles = getResources().getStringArray(R.array.screen_titles); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
       R.layout.drawer_list_item, mScreenTitles)); 
     //mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     // enable ActionBar app icon to behave as action to toggle nav drawer 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     // ActionBarDrawerToggle ties together the the proper interactions 
     // between the sliding drawer and the action bar app icon 
     mDrawerToggle = new ActionBarDrawerToggle(
       this,     /* host Activity */ 
       mDrawerLayout,   /* DrawerLayout object */ 
       R.drawable.ic_navigation_drawer, /* nav drawer image to replace 'Up' caret */ 
       R.string.drawer_open, /* "open drawer" description for accessibility */ 
       R.string.drawer_close /* "close drawer" description for accessibility */ 
     ) { 
      public void onDrawerClosed(View view) { 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 

      public void onDrawerOpened(View drawerView) { 
       getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     if (savedInstanceState == null) { 
      selectItem(0); 
     } 
} 

/* Called whenever we call invalidateOptionsMenu() */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // If the nav drawer is open, hide action items related to the content view 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // The action bar home/up action should open or close the drawer. 
    // ActionBarDrawerToggle will take care of this. 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

/* The click listner for ListView in the navigation drawer */ 
private class DrawerItemClickListener implements ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     selectItem(position); 
    } 
} 

private void selectItem(int position) { 

    } 
} 

В каждой деятельности, в которой вы хотите использовать Drawer, у вас есть чтобы построить ваш макет, как вы, текущий private_project_list.xml, используя DrawerLayout в качестве основного контейнера, макет doby вашей активности в качестве его первого дочернего элемента и макет ящика навигации в качестве второго дочернего элемента. Затем продолжается активность до DrawerActivity.

Antoher предложение, чтобы получить список в Teh DrawerActivity, вызывая HttpGetHandler() внутри него, вы должны установить адаптер только тогда, когда массив будет заполнен, иначе вы передадите к адаптеру пустой массив, поэтому список будет пустой.

О кнопке меню не отображается

В DrawerActivity кажется отсутствуют некоторые методы для панели действий, попробуйте добавить следующее

@Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 
+0

Но в документации указано, что макет навигационного ящика должен быть родительским, основной контент, который должен быть первым ребенком навигационного ящика? –

+0

Макет, который вы создаете в 'private_project_list.xml', в порядке. То, что я говорю в ответе, состоит в том, что в каждом действии, которое вы хотите показать ящик для навигации, вы должны построить макет таким же образом. Когда я говорю «как основной контейнер», я имею в виду, что Drawerlayout должен быть родительским содержимым страницы и ящиком меню – MikeKeepsOnShine

+0

Итак, единственное изменение, которое я должен сделать, чтобы сделать просмотр в ящике навигации видимым, это использовать onStart() вместо onCreate() и не вызывает setContentView() в DrawerActivity? –

Смежные вопросы