java.lang.UnsupportedOperationException:AdapterView不支持addView(View)

时间:2016-03-11 05:36:25

标签: android android-fragments gridview

您好我正在尝试在单击网格视图的项目时打开一个片段,但它显示错误java.lang.UnsupportedOperationException:AdapterView中不支持addView(View)。请帮助我。

屏幕碎片:

 public class Screen extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.screen, container, false);
        int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img};
        int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images};

        GridView grid = (GridView) view.findViewById(R.id.grid);
        Custom_Grid adapter = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            adapter = new Custom_Grid(getContext(), text, imgId);
        }

        grid.setAdapter(adapter);
        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Fragment fragment;
                FragmentManager fm = getChildFragmentManager();
                switch (position) {
                    case 0:
                        fragment = new Temperature();
                        fm.beginTransaction().replace(R.id.grid,fragment).commit();
                        break;
                    case 1:
                        fragment = new Weight();
                        fm.beginTransaction().replace(R.id.grid,fragment).commit();
                        break;
                    case 2:
                        fragment = new Length();
                        fm.beginTransaction().replace(R.id.grid,fragment).commit();
                        break;
                    case 3:
                        fragment = new Time();
                        fm.beginTransaction().replace(R.id.grid,fragment).commit();
                        break;
                    case 4:
                        fragment = new Area();
                        fm.beginTransaction().replace(R.id.grid,fragment).commit();
                        break;

  }
            }
        });
        return view;
    }
}

CustomGrid:

public class Custom_Grid extends BaseAdapter
{
    private Context mContext;
    private final int[] text;
    private final int[] Imageid;

    public Custom_Grid(Context c, int[] text, int[] Imageid) {
        mContext = c;
        this.Imageid = Imageid;
        this.text=text;
    }

    @Override
    public int getCount() {
        return text.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View grid;
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {

            grid = new View(mContext);
            grid = inflater.inflate(R.layout.grid_single, null);
            TextView textView = (TextView) grid.findViewById(R.id.grid_text);
            ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
            textView.setText(text[position]);
            imageView.setImageResource(Imageid[position]);
        } else {
            grid = (View) convertView;
        }
        return grid;
    }
}

mainactivity:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    Fragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        Screen scr = new Screen();
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.sun,scr);
        ft.commit();

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

logcat的:

FATAL EXCEPTION: main
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: Process: com.example.cherrypandu.uc, PID: 5117
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:     at android.widget.AdapterView.addView(AdapterView.java:469)
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)

3 个答案:

答案 0 :(得分:0)

您尝试使用setText() int id资源执行String,而不是检索String对象。您也没有正确地View实例化。 您的适配器应如下所示:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {

        grid = inflater.inflate(R.layout.grid_single, parent, false);
        TextView textView = (TextView) grid.findViewById(R.id.grid_text);
        ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
        textView.setText(mContext.getString(text[position]));
        imageView.setImageResource(Imageid[position]);
    } else {
        grid = convertView;
    }
    return grid;
}

此外,我强烈建议您在adaper中使用ViewHolder的模式。您可以在此处阅读:ViewHolder

答案 1 :(得分:0)

我只是给你提示,因为你没有在这里发布所有的xml文件。

在MainActivity XML中添加以下框架布局,将在其上切换/添加视图片段:

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

将此方法添加到MainActivity.java以切换framgent:

 public void switchContentWithBackStack(Fragment fragment) {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container,
                        fragment).addToBackStack(null).commit();
    } 

addToBackStack(null)会将当前片段添加到backstack。

在FragmentScreen中获取OnAttach()上的MainActivity实例:

 MainActivity mActivity;

  @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = (MainActivity) activity;
    }

    @Override
    public void onAttach(Context activity) {
        super.onAttach(activity);
        mActivity = (MainActivity) activity;
    }

To Switch Fragment通过传递要显示的Fragment对象来调用方法:

mActivity.switchContentWithBackStack(mFragment);

如果此帮助接受,如果您有疑问,请告诉我。

答案 2 :(得分:0)

屏幕片段:

Gridview的onItemClick的变化

public class Screen extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.screen, container, false);
        int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img};
        int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images};

        GridView grid = (GridView) view.findViewById(R.id.grid);
        Custom_Grid adapter = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            adapter = new Custom_Grid(getContext(), text, imgId);
        }

        grid.setAdapter(adapter);
        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Fragment fragment;
                FragmentManager fm = getActivity().getSupportFragmentManager();
                switch (position) {
                    case 0:
                        fragment = new Temperature();
                        fm.beginTransaction().replace(R.id.sun,fragment).commit();
                        break;
                    case 1:
                        fragment = new Weight();
                        fm.beginTransaction().replace(R.id.sun,fragment).commit();
                        break;
                    case 2:
                        fragment = new Length();
                        fm.beginTransaction().replace(R.id.sun,fragment).commit();
                        break;
                    case 3:
                        fragment = new Time();
                        fm.beginTransaction().replace(R.id.sun,fragment).commit();
                        break;
                    case 4:
                        fragment = new Area();
                        fm.beginTransaction().replace(R.id.sun,fragment).commit();
                        break;

  }
            }
        });
        return view;
    }
}