java - 新手 - 表格布局内的 GridView : this/getApplicationContext cannot be referenced from a static context

标签 java android android-gridview android-tablayout

我是 android 的新手,我遇到了一个问题。

按照 android 指南中的示例,我开始玩选项卡布局。一切正常,直到我尝试在“公共(public)静态类 PlaceholderFragment”中膨胀 gridview。 下面是 MainActivity.java 中代码的部分副本

public class MainActivity extends AppCompatActivity {

private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    Toast.makeText(getBaseContext(), "MainActivity onCreate End", Toast.LENGTH_LONG).show();

}

适配器:

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "TAB 1";
            case 1:
                return "TAB 2";
            case 2:
                return "TAB 3";
        }
        return null;
    }

以及包含错误的占位符:

    public static class PlaceholderFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    public static PlaceholderFragment newInstance(int sectionNumber) {

        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //Identificativo del TAB che si sta per visualizzare
        int tab_ID = getArguments().getInt(ARG_SECTION_NUMBER);

        View rootView;
        switch(tab_ID){
            case 1: rootView = inflater.inflate(R.layout.fragment_tab1, container, false);
                    break;
            case 2: rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
                    break;
            case 3: rootView = inflater.inflate(R.layout.fragment_tab3, container, false);
                    GridView gridView = (GridView) rootView.findViewById(R.id.gridview3);
                    gridView.setAdapter(new MyGridAdapter(MainActivity.this.getApplicationContext()));
                    break;

            default:rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
        }

        TextView textView = (TextView) rootView.findViewById(R.id.section_label);
        textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}

gridView.setAdapter(new MyGridAdapter(MainActivity.this.getApplicationContext())); 生成“this cannot be referenced from a static context”错误。

MyGridAdapter 代码:

private class MyGridAdapter extends BaseAdapter
{
private List<Item> items = new ArrayList<Item>();
private LayoutInflater inflater;

public MyAdapter(Context context)
{
    inflater = LayoutInflater.from(context);

    items.add(new Item("Image 1", Color.GREEN));
    items.add(new Item("Image 2", Color.RED));
    items.add(new Item("Image 3", Color.BLUE));
    items.add(new Item("Image 4", Color.GRAY));
    items.add(new Item("Image 5", Color.YELLOW));
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int i)
{
    return items.get(i);
}

@Override
public long getItemId(int i)
{
    return items.get(i).colorId;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup)
{
    View v = view;
    ImageView picture;
    TextView name;

    if(v == null)
    {
        v = inflater.inflate(R.layout.gridview_item, viewGroup, false);
        v.setTag(R.id.picture, v.findViewById(R.id.picture));
        v.setTag(R.id.text, v.findViewById(R.id.text));
    }

    picture = (ImageView)v.getTag(R.id.picture);
    name = (TextView)v.getTag(R.id.text);

    Item item = (Item)getItem(i);

    picture.setBackgroundColor(item.colorId);
    name.setText(item.name);

    return v;
}

private class Item
{
    final String name;
    final int colorId;

    Item(String name, int drawableId)
    {
        this.name = name;
        this.colorId = drawableId;
    }
}

我尝试仿效其他一些示例,但没有成功。 如果我不将 PlaceholderFragment 类声明为静态,我会在 SectionPagerAdapter 类中遇到 PlaceholderFragment.newInstance(position + 1) 问题。

有人可以帮我解决和理解这个问题吗?

非常感谢!

最佳答案

在 fragment 中,您可以通过调用 getActivity() 方法来获取 Activity 。一旦有了 Activity 对象,就可以通过 getAtivity().getApplicaionContext(); 获取应用程序上下文;

gridView.setAdapter(new MyGridAdapter(getActivity().getApplicationContext()));

关于java - 新手 - 表格布局内的 GridView : this/getApplicationContext cannot be referenced from a static context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34528702/

相关文章:

java - 添加子表计数以使用 hibernate criteria API 从父表中选择

java - 如何在没有 Maven 的情况下设置独立的 Junit 和 Mockito

android - 关闭 Android Studios 糟糕的风格建议?

android - ExoPlayer 无法从文件中播放

android - 有没有办法在 Android Studio 上创建具有 XXXHDPI 密度的模拟器?

android - 如何传递对象数组列表来填充每个部分标题文本及其内容?

android - 在选项卡布局中添加 gridview

java - Kryonet连接成功但收不到消息

java - 使用 Java 将 TXT 转换为 XML 的简单示例

android - 使用 AsyncTask 加载更多 - Android