GridView 适配器不适用于方向更改

GridView Adapter not working with Orientation change

我一直在学习如何在 android 中使用 GridView。我写了一个示例 class,它使用片段在网格视图中加载数据。我能够在网格视图中正确加载详细信息,但是每当我改变方向时,我的网格视图就会变空。

PS : 我在互联网上阅读有关 android:configChanges 的内容,我不想使用它。

这是我的代码:

public class MyActivity extends AppCompatActivity {

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

        // find the fragment on activity restarts
        FragmentManager fm = getSupportFragmentManager();
        MyFragment fragment = (MyFragment) fm.findFragmentByTag("my-frag");

        // create the fragment and data the first time
        if (fragment == null) {
            // add the fragment
            fragment = new MyFragment();
            fm.beginTransaction().add(R.id.container, new MyFragment(), "my-frag").commit();
        } else {
            // load the data from the results
            fragment.loadData();
        }
    }

}

片段Class

/**
 * A placeholder fragment containing a simple view.
 */
public class MyFragment extends Fragment {

    public MyFragment() {
    }

    private GridView resultGridView;
    private MyAdapter myAdapter;

    private String[] urls = new String[]{"https://www.gravatar.com/avatar/38e4dbce6996ba5d73c56bee4297d385?s=328&d=identicon&r=PG&f=1", "https://www.gravatar.com/avatar/38e4dbce6996ba5d73c56bee4297d385?s=328&d=identicon&r=PG&f=1", "https://www.gravatar.com/avatar/38e4dbce6996ba5d73c56bee4297d385?s=328&d=identicon&r=PG&f=1"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retain this fragment across configuration changes.
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        resultGridView = (GridView) view.findViewById(R.id.grid);

        myAdapter = new MyAdapter(getActivity(), urls);
        resultGridView.setAdapter(myAdapter);

        return view;
    }

    public void loadData() {
        resultGridView.invalidateViews();
        myAdapter.notifyDataSetChanged();
    }

}

适配器Class

public class MyAdapter extends BaseAdapter {

    private Context context;
    private final LayoutInflater mLayoutInflater;

    private String[] urls;

    public MyAdapter(final Context context, String[] urls) {
        super();
        this.context = context;
        mLayoutInflater = LayoutInflater.from(context);
        this.urls = urls;
    }

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

    @Override
    public Object getItem(int i) {
        return urls[i];
    }

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

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {

        ViewHolder vh;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.list_item, parent, false);
            vh = new ViewHolder();
            vh.imageView = (ImageView) convertView.findViewById(R.id.image);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }

        Picasso.with(context).load(urls[position]).into(vh.imageView);
        return convertView;
    }

    static class ViewHolder {
        ImageView imageView;
    }
}

您尝试过使用 OnSaveInstanceState(Bundle) 吗?

您可以通过向适配器添加方法 getUrls() 和 setUrls 来尝试:

public void getURLs(){
    return urls;
}
public void setURLs(String[] urls){
    this.urls = urls;
}

然后将以下行添加到片段中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mData = savedInstanceState.getStringArray("urls");
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putStringArray("urls", (getListAdapter().getURLs()));
    super.onSaveInstanceState(outState);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    myAdapter.setUrls(mData);
    loadData()
}

此外,您应该遵循 Android 代码风格指南:https://source.android.com/source/code-style.html