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
我一直在学习如何在 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