结合导航抽屉,片段和arrayadapter

时间:2014-02-04 20:45:35

标签: android android-listview android-fragments android-arrayadapter android-fragmentactivity

我有一个使用导航抽屉的应用程序,五个片段,每个片段都显示一个填充了一些文本的Listview。

它看起来非常糟糕和凌乱所以现在我想要提出一些更清洁的东西并使用部分。我来了一个应用程序似乎使用ArrayAdapter + ListActivity,所以我想我给它一个镜头,并在我的应用程序中包含类似的东西。

虽然我在实施时遇到错误。

这就是我的MainActivity的样子:

public class MainActivity extends FragmentActivity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

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


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

    mTitle = mDrawerTitle = getTitle();
    mFragmentTitles = getResources().getStringArray(R.array.fragments);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
    mDrawerList = (ListView) findViewById(R.id.drawer_list);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);
    mDrawerList.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, mFragmentTitles));
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
    getActionBar().setDisplayShowHomeEnabled(false);
    ActionBar ab = getActionBar(); //need  import android.app.ActionBar;
    ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#002d55"));     
    ab.setBackgroundDrawable(colorDrawable);

    mDrawerToggle = new ActionBarDrawerToggle(this, 
    mDrawerLayout, 
    R.drawable.ic_drawer, 
    R.string.drawer_open, 
    R.string.drawer_close 
    ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); 
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); 
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    if (savedInstanceState == null) {
        selectItem(0);
    }
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
    case android.R.id.home:
        if (mDrawerLayout.isDrawerOpen(mDrawerList)){
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
        return true;

    default:
        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) {
    Fragment newFragment = new Fragment_1();
    FragmentManager fm = getSupportFragmentManager();
    switch(position){
    case 0:
        newFragment = new Fragment_1();
        break;
    case 1:
        newFragment = new Fragment_2();
        break;
    case 2:
        newFragment = new Fragment_3();
        break;
    case 3:
        newFragment = new Fragment_4();
        break;
    case 4:
        newFragment = new Fragment_5();
        break;

    }
    fm.beginTransaction().replace(R.id.content_frame, newFragment)
    .commit();


    mDrawerList.setItemChecked(position, true);
    setTitle(mFragmentTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);

}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

@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);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

}

但我在这些地方出现错误,上面写着“类型不匹配:无法从Fragment_1转换为Fragment”:

片段newFragment = 新Fragment_1();

FragmentManager fm = getSupportFragmentManager();

开关(位置){

案例0:

newFragment = ** new Fragment_1(); **

中断;

这是我的Fragment_1:

public class Fragment_1 extends ListActivity {

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

    LayoutInflater i = LayoutInflater.from(this);

    List<Item> items = new ArrayList<Item>();
    items.add(new Header(i, "Januari"));
    items.add(new EventItem(i, "Vasalunds IF" , "Skytteholms IP, 19/1 18:00"));
    items.add(new EventItem(i, "Molde FK" , "La Manga, 27/1 16:00"));
    items.add(new EventItem(i, "Rosenborg BK", "La Manga, 30/1 16:00"));

    items.add(new Header(i, "Februari"));
    items.add(new EventItem(i, "FC Astra" , "La Manga, 2/2 19:00"));
    items.add(new EventItem(i, "FC Costuleni", "Pinatar Arena, 5/2 16:00"));
    items.add(new EventItem(i, "IF Elfsborg", "Skytteholms IP, 15/2 13:00"));
    items.add(new EventItem(i, "Liaoning Whowin FC" , "Shenzhen, 23/2 15:00"));

    items.add(new Header(i, "Mars"));
    items.add(new EventItem(i, "Shenzhen Ruby FC" , "Shenzhen, 1/3 13:00"));
    items.add(new EventItem(i, "Guangzhou R&F FC", "Shenzhen, 1/3 15:30"));
    items.add(new EventItem(i, "HJK Helsingfors", "Skytteholms IP, 16/3 13:00"));
    items.add(new EventItem(i, "Kalmar FF" , "Skytteholms IP, 22/3 15:00"));
    items.add(new EventItem(i, "IFK Göteborg" , "Nationalarenan, 31/3 19:00"));

    items.add(new Header(i, "April"));
    items.add(new EventItem(i, "Gefle IF" , "Strömvallen, 6/4 15:00"));
    items.add(new EventItem(i, "Örebro SK" , "Nationalarenan, 13/4 15:00"));
    items.add(new EventItem(i, "Dif", "Tele2 Arena, 16/4 19:00"));
    items.add(new EventItem(i, "IFK Norrköping" , "Nationalarenan, 20/4 17:30"));
    items.add(new EventItem(i, "BK Häcken" , "Gamla Ullevi, 27/4 17:30"));

    items.add(new Header(i, "Maj"));
    items.add(new EventItem(i, "Helsingborgs IF" , "Nationalarenan, 5/5 19:00"));
    items.add(new EventItem(i, "Halmstads BK" , "Örjans Vall, 8/5 19:00"));
    items.add(new EventItem(i, "Mjällby AIF", "Nationalarenan, 11/5 15:00"));
    items.add(new EventItem(i, "IF Elfsborg" , "Nationalarenan, 15/5 19:00"));
    items.add(new EventItem(i, "Malmö FF" , "Swedbank Stadion, 26/5 19:00"));

    items.add(new Header(i, "Juni"));
    items.add(new EventItem(i, "IF Brommapojkarna" , "Nationalarenan, 2/6 19:00"));

    MyListAdapter adapter = new MyListAdapter(this, items);
    setListAdapter(adapter);
}

和fragment_1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragment_1" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

1 个答案:

答案 0 :(得分:0)

您正尝试将Fragment_1对象分配给Fragment类型的变量。问题是Fragment_1继承自ListActivity,而不是Fragment

请考虑从使用ListActivity更改为使用ListFragment