listview在片段上不起作用-OutOfMemoryError:无法分配 [英] listview does not work on fragment - OutOfMemoryError: Failed to allocate
问题描述
ListView
在片段上不起作用,我对此尝试了一些代码,但再次说到应用程序已停止"
ListView
does not work on fragments, I tried some codes on this, but again it continues to say - "the app is stopped"
我的主要活动
public class OrtaMain extends Fragment {
private ListView listView;
private int[] user_poster_resources={
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home
};
private int[] alt_resource={
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home,
R.drawable.home
};
private String[] konu_basliks;
private String[] konu_tarihs;
private String[] konu_iceriks;
OrtaMainAdapter adapter;
public OrtaMain() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_orta_main, container, false);
listVie = (ListView) view.findViewById(R.id.orta_main_liste);
konu_basliks = getResources().getStringArray(R.array.strin_baslik);
konu_tarihs = getResources().getStringArray(R.array.konu_tarih);
konu_iceriks = getResources().getStringArray(R.array.konu_icerik);
int i = 0;
adapter = new OrtaMainAdapter(getActivity(), R.layout.ortamain_item);
listView.setAdapter(adapter);
for (String basliklar:konu_basliks) {
OrtaMainDataProvider dataProvider = new OrtaMainDataProvider(basliklar);
adapter.add(dataProvider);
i++;
}
return view;
}
}
数据提供者
public class OrtaMainDataProvider {
private String baslik;
public OrtaMainDataProvider(String baslik) {
this.setBaslik(baslik);
}
public String getBaslik() {
return baslik;
}
public void setBaslik(String baslik) {
this.baslik = baslik;
}
}
适配器类
public class OrtaMainAdapter extends ArrayAdapter {
List list = new ArrayList();
public OrtaMainAdapter(@NonNull Context context, @LayoutRes int resource) {
super(context, resource);
}
@Override
public void add(@Nullable Object object) {
super.add(object);
list.add(object);
}
static class DataHandler{
TextView konu_baslik;
}
public int getCount(){
return this.list.size();
}
@Nullable
@Override
public Object getItem(int position) {
return this.list.get(position);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View row;
row = convertView;
DataHandler handler;
if (convertView == null){
LayoutInflater inflater =(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.ortamain_item, parent, false);
handler = new DataHandler();
handler.konu_baslik = (TextView) row.findViewById(R.id.orta_main_baslik);
row.setTag(handler);
}
else{
handler = (DataHandler) row.getTag();
}
OrtaMainDataProvider dataProvider;
dataProvider= (OrtaMainDataProvider) this.getItem(position);
handler.konu_baslik.setText(dataProvider.getBaslik());
return row;
}
}
和 logcat信息
06-27 14:31:37.836 11336-11336/com.example.cc.trafikprojesi E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.cc.trafikprojesi, PID: 11336
java.lang.OutOfMemoryError: Failed to allocate a 80281612 byte allocation with 16777216 free bytes and 42MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2423)
at android.content.res.Resources.loadDrawable(Resources.java:2330)
at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
at android.widget.ImageView.<init>(ImageView.java:146)
at android.widget.ImageView.<init>(ImageView.java:135)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1029)
at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1087)
这些代码在任何简单的活动中都能正常工作.当我测试别人的时候.但是当我输入这些代码时,列表视图不起作用,并且模拟器正在停止..
Those codes are working well on any simple activity. When I test anothers. but when i put those codes, the listview does not work and emulator is stopping..
此外,当我不放置ListView
代码时,fragment可以很好地工作,而fragment给出了错误,并且在模拟器上不起作用.
Also, fragment works well when I don't put the ListView
code, and fragment give error and does not work on emulator.
ListView
对片段不起作用吗?我必须只穿无碎片的衣服吗?
Do ListView
not work on fragments? Must I put only on nonfragments?
推荐答案
这是我建议的内容,应该会有所帮助...
Here's what I recommend, it should help...
您可以忽略问题 不推荐 ,并通过将其添加到android清单文件中来增加heapSize:
You can ignore the problem not recommended and increase the heapSize by adding this to your android manifest file:
<application android:largeHeap="true"
还要设置Bitmap.Config
类型为RGB_565
而不是ARGB_8888
,以保持位图较小.
Also set Bitmap.Config
type RGB_565
instead of ARGB_8888
to keep the bitmaps smaller.
但是最好的选择是花一些时间并使用 LeakCanary 配置您的应用程序并采用观看此视频以学习Android的内存管理- Google I/O 2011:Android的内存管理应用(从 4:12 播放,以了解largeHeap=true
为何不好. ),然后在 8:31 中详细了解了堆的使用.
But the best option here would be to take some time and profile your application with LeakCanary and take a look at this video to learn Memory Management for Android - Google I/O 2011: Memory management for Android Apps (Play from 4:12 to see why largeHeap=true
is bad.) then at 8:31 they go into detail on understanding heap usage.
大堆修复程序是一个临时修复程序,不应视为最终修复程序.我强烈建议进行剖析,看看片段生命周期在Fragment完全完成之前调用onDetach()
方法,您可能要在这里释放所有资源.片段本身被销毁并进行gc'ed操作并不意味着您分配的所有资源都将被删除.
The large heap fix it's a temporary fix and shouldn't be considered final. I highly recommend profiling, Take a look at the Fragment life cycle the method that is called before the Fragment is completely done with is the onDetach()
method, you may want to release all the resources here. The fact that a fragment itself is destroyed and gc'ed does not mean all resources you allocated were removed.
这篇关于listview在片段上不起作用-OutOfMemoryError:无法分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!