在片段内将 RecyclerView 与 Parse 数据库一起使用时遇到问题
Having trouble with using RecyclerView with Parse database inside a fragment
我是 Android 编程的新手,我正在尝试将 Parse 数据库连接到我的 RecyclerView。当我打开这个片段时,它会关闭整个应用程序失败。当我的事件对象只有一个参数并且我查询了数据库的一个部分时,它一直在工作,但我不得不将它更改为一个单独的对象,因为我需要数据库的更多部分。我还尝试将不同部分的 RecyclerView 移入和移出 Query 方法,但它仍然无法打开,因为在我确定我的问题出在 EventFragment class.
之前它一直在工作
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import java.util.Collections;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*
*/
public class EventFragment extends android.support.v4.app.Fragment {
TextView text;
private RecyclerView recyclerView;
public static adapter adapt;
public static List<Event> dbObjects = Collections.emptyList();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Log.d("IN EVENT FRAGMENT", "WE ARE IN!!!!");
// Inflate the layout for this fragment
final View v = inflater.inflate(R.layout.fragment_event, container, false);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.whereExists("title");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objList, ParseException e) {
//dbObjects = scoreList;
//adapt = new adapter(getActivity(), dbObjects);
if (e == null) {
for (ParseObject obj : objList) {
//Log.d("DEBUG", "The username is:" + dbObjects.size());
Event event = new Event(obj.getString("title"), obj.getString("eventDate"));
dbObjects.add(event);
}
} else {
Log.d("HELLO", "Something went wrong!");
}
}
});
//RecyclerView
adapt = new adapter(getActivity(), dbObjects);
recyclerView = (RecyclerView) v.findViewById(R.id.recycle);
recyclerView.setAdapter(adapt);
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
final LinearLayoutManager llm = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(llm);
return v;
}
}
这是我的适配器 class
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
public class adapter extends RecyclerView.Adapter<adapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
public static List<Event> data;
public adapter(Context context, List<Event> objects) {
this.context = context;
inflater = LayoutInflater.from(context);
this.data = objects;
}
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.custom, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
public void onBindViewHolder(MyViewHolder holder, int position) {
Event current = data.get(position);
holder.title.setText(current.getTitle());
holder.date.setText(current.getDate());
}
public int getItemCount() {
return data.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView date;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
date = (TextView) itemView.findViewById(R.id.date);
}
}
}
还有我的事件对象
public class Event {
public String title;
public String date;
public Event(String tit, String dat) {
title = tit;
date = dat;
}
public String getTitle() {
return title;
}
public String getDate() {
return date;
}
}
Logcat
09-10 09:10:02.116 6767-6767/? I/art﹕ Not late-enabling -Xcheck:jni (already on)
09-10 09:10:03.231 6767-6779/suyash.sjsu_cs_club I/art﹕ Background sticky concurrent mark sweep GC freed 1793(132KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 35MB/35MB, paused 3.498ms total 116.782ms
09-10 09:10:03.241 6767-6779/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 9.643ms
09-10 09:10:03.452 6767-6779/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 10.751ms
09-10 09:10:03.922 6767-6790/suyash.sjsu_cs_club D/OpenGLRenderer﹕ Render dirty regions requested: true
09-10 09:10:03.928 6767-6767/suyash.sjsu_cs_club D/﹕ HostConnection::get() New Host Connection established 0xae0b8e70, tid 6767
09-10 09:10:03.953 6767-6767/suyash.sjsu_cs_club D/Atlas﹕ Validating map...
09-10 09:10:04.041 6767-6790/suyash.sjsu_cs_club D/﹕ HostConnection::get() New Host Connection established 0xa6c91360, tid 6790
09-10 09:10:04.069 6767-6790/suyash.sjsu_cs_club I/OpenGLRenderer﹕ Initialized EGL, version 1.4
09-10 09:10:04.188 6767-6790/suyash.sjsu_cs_club D/OpenGLRenderer﹕ Enabling debug mode 0
09-10 09:10:04.205 6767-6790/suyash.sjsu_cs_club W/EGL_emulation﹕ eglSurfaceAttrib not implemented
09-10 09:10:04.205 6767-6790/suyash.sjsu_cs_club W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6cab0c0, error=EGL_SUCCESS
09-10 09:10:21.407 6767-6767/suyash.sjsu_cs_club D/AndroidRuntime﹕ Shutting down VM
09-10 09:10:21.408 6767-6767/suyash.sjsu_cs_club E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: suyash.sjsu_cs_club, PID: 6767
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:404)
at java.util.AbstractList.add(AbstractList.java:425)
at suyash.sjsu_cs_club.EventFragment.done(EventFragment.java:66)
at suyash.sjsu_cs_club.EventFragment.done(EventFragment.java:54)
at com.parse.ParseTaskUtils.run(ParseTaskUtils.java:115)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
09-10 09:11:52.915 6767-6774/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 5.668ms
这也是一个单独的问题,可能需要第二个 post 但是我如何为 RecyclerView 创建一个 onItemClickListener,其内容在数据库中经常变化?
问题出在这行代码中:
public static List<Event> dbObjects = Collections.emptyList();
如果改成
public static List<Event> dbObjects = new LinkedList<Event>();
它会起作用。
为什么?因为 Collections.emptyList()
returns EmptyList
这是 AbstractList
的自定义实现,它什么都不做。
这是 EmptyView
class 的样子。
private static final class EmptyList extends AbstractList
implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
@Override public boolean contains(Object object) {
return false;
}
@Override public int size() {
return 0;
}
@Override public Object get(int location) {
throw new IndexOutOfBoundsException();
}
@Override public Iterator iterator() {
return EMPTY_ITERATOR;
}
private Object readResolve() {
return Collections.EMPTY_LIST;
}
}
这里是 AbstractList
中 add()
方法的片段。
@Override
public boolean add(E object) {
add(size(), object);
return true;
}
public void add(int location, E object) {
throw new UnsupportedOperationException();
}
我是 Android 编程的新手,我正在尝试将 Parse 数据库连接到我的 RecyclerView。当我打开这个片段时,它会关闭整个应用程序失败。当我的事件对象只有一个参数并且我查询了数据库的一个部分时,它一直在工作,但我不得不将它更改为一个单独的对象,因为我需要数据库的更多部分。我还尝试将不同部分的 RecyclerView 移入和移出 Query 方法,但它仍然无法打开,因为在我确定我的问题出在 EventFragment class.
之前它一直在工作import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import java.util.Collections;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*
*/
public class EventFragment extends android.support.v4.app.Fragment {
TextView text;
private RecyclerView recyclerView;
public static adapter adapt;
public static List<Event> dbObjects = Collections.emptyList();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Log.d("IN EVENT FRAGMENT", "WE ARE IN!!!!");
// Inflate the layout for this fragment
final View v = inflater.inflate(R.layout.fragment_event, container, false);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.whereExists("title");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objList, ParseException e) {
//dbObjects = scoreList;
//adapt = new adapter(getActivity(), dbObjects);
if (e == null) {
for (ParseObject obj : objList) {
//Log.d("DEBUG", "The username is:" + dbObjects.size());
Event event = new Event(obj.getString("title"), obj.getString("eventDate"));
dbObjects.add(event);
}
} else {
Log.d("HELLO", "Something went wrong!");
}
}
});
//RecyclerView
adapt = new adapter(getActivity(), dbObjects);
recyclerView = (RecyclerView) v.findViewById(R.id.recycle);
recyclerView.setAdapter(adapt);
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
final LinearLayoutManager llm = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(llm);
return v;
}
}
这是我的适配器 class
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
public class adapter extends RecyclerView.Adapter<adapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
public static List<Event> data;
public adapter(Context context, List<Event> objects) {
this.context = context;
inflater = LayoutInflater.from(context);
this.data = objects;
}
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.custom, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
public void onBindViewHolder(MyViewHolder holder, int position) {
Event current = data.get(position);
holder.title.setText(current.getTitle());
holder.date.setText(current.getDate());
}
public int getItemCount() {
return data.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView date;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
date = (TextView) itemView.findViewById(R.id.date);
}
}
}
还有我的事件对象
public class Event {
public String title;
public String date;
public Event(String tit, String dat) {
title = tit;
date = dat;
}
public String getTitle() {
return title;
}
public String getDate() {
return date;
}
}
Logcat
09-10 09:10:02.116 6767-6767/? I/art﹕ Not late-enabling -Xcheck:jni (already on)
09-10 09:10:03.231 6767-6779/suyash.sjsu_cs_club I/art﹕ Background sticky concurrent mark sweep GC freed 1793(132KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 35MB/35MB, paused 3.498ms total 116.782ms
09-10 09:10:03.241 6767-6779/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 9.643ms
09-10 09:10:03.452 6767-6779/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 10.751ms
09-10 09:10:03.922 6767-6790/suyash.sjsu_cs_club D/OpenGLRenderer﹕ Render dirty regions requested: true
09-10 09:10:03.928 6767-6767/suyash.sjsu_cs_club D/﹕ HostConnection::get() New Host Connection established 0xae0b8e70, tid 6767
09-10 09:10:03.953 6767-6767/suyash.sjsu_cs_club D/Atlas﹕ Validating map...
09-10 09:10:04.041 6767-6790/suyash.sjsu_cs_club D/﹕ HostConnection::get() New Host Connection established 0xa6c91360, tid 6790
09-10 09:10:04.069 6767-6790/suyash.sjsu_cs_club I/OpenGLRenderer﹕ Initialized EGL, version 1.4
09-10 09:10:04.188 6767-6790/suyash.sjsu_cs_club D/OpenGLRenderer﹕ Enabling debug mode 0
09-10 09:10:04.205 6767-6790/suyash.sjsu_cs_club W/EGL_emulation﹕ eglSurfaceAttrib not implemented
09-10 09:10:04.205 6767-6790/suyash.sjsu_cs_club W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6cab0c0, error=EGL_SUCCESS
09-10 09:10:21.407 6767-6767/suyash.sjsu_cs_club D/AndroidRuntime﹕ Shutting down VM
09-10 09:10:21.408 6767-6767/suyash.sjsu_cs_club E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: suyash.sjsu_cs_club, PID: 6767
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:404)
at java.util.AbstractList.add(AbstractList.java:425)
at suyash.sjsu_cs_club.EventFragment.done(EventFragment.java:66)
at suyash.sjsu_cs_club.EventFragment.done(EventFragment.java:54)
at com.parse.ParseTaskUtils.run(ParseTaskUtils.java:115)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
09-10 09:11:52.915 6767-6774/suyash.sjsu_cs_club W/art﹕ Suspending all threads took: 5.668ms
这也是一个单独的问题,可能需要第二个 post 但是我如何为 RecyclerView 创建一个 onItemClickListener,其内容在数据库中经常变化?
问题出在这行代码中:
public static List<Event> dbObjects = Collections.emptyList();
如果改成
public static List<Event> dbObjects = new LinkedList<Event>();
它会起作用。
为什么?因为 Collections.emptyList()
returns EmptyList
这是 AbstractList
的自定义实现,它什么都不做。
这是 EmptyView
class 的样子。
private static final class EmptyList extends AbstractList
implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
@Override public boolean contains(Object object) {
return false;
}
@Override public int size() {
return 0;
}
@Override public Object get(int location) {
throw new IndexOutOfBoundsException();
}
@Override public Iterator iterator() {
return EMPTY_ITERATOR;
}
private Object readResolve() {
return Collections.EMPTY_LIST;
}
}
这里是 AbstractList
中 add()
方法的片段。
@Override
public boolean add(E object) {
add(size(), object);
return true;
}
public void add(int location, E object) {
throw new UnsupportedOperationException();
}