- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我之前问题的后续问题:Parse RecyclerView Image Query
我现在有一个矛盾的空指针异常。我正在尝试按照下面概述的方式从内部方法中提取列表。
public List<ParseObject> objectList;
public List<String> getData(String filter){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> downloads, com.parse.ParseException e) {
if (e == null) {
objectList=downloads;
} else {
Log.d("score", "Error: " + e.getMessage());
}
}
});
int size = objectList.size();
for (int i = 0; i<size; i++){
ParseFile file = (ParseFile) objectList.get(i).get("Image");
urlList.add(file.getUrl());
}
return urlList;
}
我该如何解决这个问题?有哪些方法比我现在使用的更好?
编辑:
这是它正在做的事情。目前没有异常,但是recyclerview没有显示任何东西。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_events, container, false);
setList("sport", rootView);
return rootView;
}
public void set() {
}
public void setList(String filter, View view){
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter myAdapter = new MyAdapter(getData(filter));
recyclerView.setAdapter(myAdapter);
}
编辑 2:更多更新代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_events, container, false);
setList("sport", rootView);
return rootView;
}
public void set() {
}
public void setList(String filter, View view){
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter myAdapter = new MyAdapter(getData(filter));
recyclerView.setAdapter(myAdapter);
}
private List<String> urlList = new ArrayList<>();
public List<ParseObject> objectList = new ArrayList<>();
public int size;
public List<String> getData(String filter){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> downloads, com.parse.ParseException e) {
if (e == null) {
Toast.makeText(getActivity(), "Downloads retrieved", Toast.LENGTH_SHORT).show();
objectList.addAll(downloads);
} else {
Log.d("score", "Error: " + e.getMessage());
}
size = objectList.size();
}
});
for (int i = 0; i<size; i++){
ParseFile file = (ParseFile) objectList.get(i).get("Image");
urlList.add(file.getUrl());
}
return urlList;
}
编辑 3:更新,我添加了我的适配器代码。
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.activity_events, container, false);
new GetUrlListTask(this).execute("sport");
return rootView;
}
public void set() {
}
private List<String> urlList = new ArrayList<>();
public List<ParseObject> objectList = new ArrayList<>();
public int size;
public List<String> getData(String filter){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> downloads, com.parse.ParseException e) {
if (e == null) {
Toast.makeText(getActivity(), "Downloads retrieved", Toast.LENGTH_SHORT).show();
objectList.addAll(downloads);
} else {
}
size = objectList.size();
}
});
for (int i = 0; i<size; i++){
ParseFile file = (ParseFile) objectList.get(i).get("Image");
urlList.add(file.getUrl());
}
return urlList;
}
private class GetUrlListTask extends AsyncTask<String,Void,List<String>>
{
private WeakReference<Fragment> weakRef;
public GetUrlListTask(Fragment frag){
weakRef = new WeakReference< Fragment >(frag);
}
@Override
protected List<String> doInBackground(String... filters) {
return getData(filters[0]);
}
@Override
protected void onPostExecute(List<String> urlList) {
Fragment frag = weakRef.get();
if (frag != null){
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter myAdapter = new MyAdapter(urlList);
recyclerView.setAdapter(myAdapter);
}
}
}
还有我的适配器:
List<String> urls;
ViewGroup parent;
public MyAdapter(List<String> urls){
this.urls=urls;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_entry, parent);
MyViewHolder myViewHolder = new MyViewHolder(view);
this.parent=parent;
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Picasso.with(parent.getContext())
.load(urls.get(position))
.into(holder.photo);
Toast.makeText(parent.getContext(), urls.get(position), Toast.LENGTH_LONG).show();
}
@Override
public int getItemCount() {
return urls.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
ImageView photo;
public MyViewHolder(View itemView) {
super(itemView);
photo = (ImageView) itemView.findViewById(R.id.listImage);
}
}
最佳答案
所以我假设您想要做的是一旦您获得 urlList,您想要更新一些 View 。如果是这样的话,那么我想你想做的是在后台任务中运行整个方法,而不仅仅是像这样的查询:
首先更改您的 getData() 方法:
public List<String> getData(String filter){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
objectList = query.find(); //I think you have to surround this by a try catch or have the method throw an exception
int size = objectList.size();
for (int i = 0; i<size; i++){
ParseFile file = (ParseFile) objectList.get(i).get("Image");
urlList.add(file.getUrl());
}
return urlList;
}
请注意,由于您正在进行网络调用,因此上述方法现在必须从后台线程运行。
然后您可以使用类似 AsyncTask 的东西来更新 View :
private class GetUrlListTask extends AsyncTask<String,Void,List<String>>
{
private WeakReference<Fragment> weakRef;
public PhotoTagsFetchTask(Fragment frag){
weakRef = new WeakReference< Fragment >(frag);
}
@Override
protected Void doInBackground(String... filters) {
return getData(filters[0]);
}
@Override
protected void onPostExecute(List<String> urlList) {
Fragment frag = weakRef.get();
if (frag != null){
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter myAdapter = new MyAdapter(urlList);
recyclerView.setAdapter(myAdapter);
}
}
}
注意上面使用弱引用是为了避免上下文泄漏(基本上避免了不必要的内存泄漏)。
你也可以这样做:
public void getData(String filter){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> downloads, com.parse.ParseException e) {
if (e == null) {
objectList=downloads;
int size = objectList.size();
for (int i = 0; i<size; i++){
ParseFile file = (ParseFile) objectList.get(i).get("Image");
urlList.add(file.getUrl());
}
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter myAdapter = new MyAdapter(urlList);
recyclerView.setAdapter(myAdapter);
} else {
Log.d("score", "Error: " + e.getMessage());
}
}
});
}
关于java - ParseQuery NullPointer 异常悖论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31840590/
我有一个 Game 类,其中包含一个带有键“players”的 ParseUsers 数组: @ParseClassName(Game.GAME) public class Game extends
我有两个相关对象(商店和项目)。 Item 对象有一个包含其 Shop 对象的字段。 如何创建一个 parseQuery 来让所有商店至少有一件商品。 最佳答案 你必须写一个云代码 Elnaz jan
抱歉,如果我写得不好,我是法国人。 我有一系列这样的项目: items = [ {nom: 'xxx', prenom: 'zzz', montant: 500}, {
我正在使用解析库: compile 'com.parse.bolts:bolts-tasks:1.3.0' compile 'com.parse:parse-android:1.11.0' 我
我知道这是一个菜鸟问题,但我在其他地方找不到任何答案。我是编程新手,所以请彻底解释。 我正在与 parse.com 合作。我正在尝试获取包含 3-20 个对象的查询。我需要显示对象。经过尝试、调试和研
我有一个提要,其中包含当前按“updatedAt”排序的帖子。我的初衷是将帖子推到最后回复的提要顶部(我通过在用户留下评论时增加每个帖子中的“replyCount”字段来做到这一点),但没有完全意识到
这是我之前问题的后续问题:Parse RecyclerView Image Query 我现在有一个矛盾的空指针异常。我正在尝试按照下面概述的方式从内部方法中提取列表。 public List obj
我在通过 ParseQuery 数组进行搜索时遇到问题。 我需要不区分大小写的搜索,所以我需要将我的数组转换为小写。 我尝试了 query.whereMatches 和 query.whereCont
我正在创建一个应用程序,其中有一个顶级用户列表。我从 ParseQuery 获取列表。我希望列表跳转到特定用户。 索引返回-1,我不明白为什么。你能帮忙吗? void queryTopTen() {
我正在使用以下代码搜索我的数据浏览器。列是 Location 和 Weather,类称为 Nowcast。如果我的 Data Browser 中有纽约并且天气 "sunny",则 TextView s
我有以下代码: func init() { today := time.Now() // If ENDPOINT is empty, It'll use this hardcoded
我的查询有几个限制: ParseQuery requestsQuery = ParseQuery.getQuery(ParseConstantsUtil.CLASS_REQUEST); reques
我想向此语句返回一个字符串:StringreplyUsername = queryUsernameById(objectId); 查询方法如下: public String queryUsername
我正在尝试将图像填充到一个单元格中,但由于某种原因,它在不应该加载到其他单元格中。 我不确定是什么原因导致的。 我不确定,但是当我快速向下滚动时它会加载在不应该这样的时候进入所有 ImageView
我能够检索查询结果,但我似乎无法将它们推送到我的模板。 BlogApp.Views.Blog = Parse.View.extend({ template: Handlebars.compil
如何正确处理 throwIndexOutOfBoundsException?基本上,我正在查询用户。如果用户存在,它会显示他们的个人资料。但是,如果找不到条目,它会使我的应用程序崩溃并引发异常。我
我有一个 HorizontalScrollView 作为 ListView 的一个项目。每个 HorizontalScrollView 中都有可点击的图像。水平 ScrollView 也应该有
我想知道如何删除从 ParseQuery 返回的所有 ParseObject。ParseQuery 必须在特定字段(“keyField”)中找到包含特定字符串(“keyString”)的所有对象,如
我正在使用 parse.com 的 Android SDK,遇到了一个特殊问题。 来自 fragment 的 onCreate: 从服务器获取对象。 将其固定。 从本地数据存储中获取对象。 这是 on
当我使用 Webpack2 编译我的文件时。它显示了以下警告: "loaderUtils.parseQuery() received a non-string value which can be p
我是一名优秀的程序员,十分优秀!