我正在使用解析,有时我的查询将返回一个空列表。我希望能够通过在文本视图中显示文本来处理这种情况。当列表返回对象时,代码似乎工作正常,但当列表为空时,代码似乎没有。不确定错误但应用程序崩溃了。
public class ReviewPage extends Activity {
String obj, rName, rating, reviews;
TextView txtview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_review_page);
Intent i = getIntent();
obj = i.getStringExtra("RestName");
txtview = (TextView) findViewById(R.id.review1);
getReview(obj);
}
public void getReview(String obj) {
ParseQuery<ParseObject> query = ParseQuery.getQuery("Reviews");
query.whereEqualTo("Restraunt", obj);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> reviewList, ParseException e) {
if (e == null) {
ParseObject review = reviewList.get(0);
if (review == null) {
txtview.setText("No Reviews yet");
} else {
rName = review.getString("Name");
rating = review.getString("Rating");
reviews = review.getString("review");
txtview.setText(rName + "\n" + reviews);
}
} else {
txtview.setText("No Reviews yet");
e.printStackTrace();
}
}
});
}
public void Submit(View v) {
final EditText edit = (EditText) findViewById(R.id.review);
final EditText edit1 = (EditText) findViewById(R.id.rName);
String rName = edit1.getText().toString();
String review = edit.getText().toString();
ParseObject newReview = new ParseObject("Reviews");
newReview.put("Name", rName);
newReview.put("review", review);
newReview.put("Restraunt", obj);
newReview.saveInBackground();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.review_page, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:0)
应用程序崩溃是因为你试图从空列表中获取一个项目(如你所说,Parse返回一个空列表),这会抛出一个IndexOutOFBoundException
。如果我是你,我会在使用ParseObject列表做一些事情之前添加一个空检查和一个空检查。这样的事情可以做到:
if (e == null) {
if(reviewList!=null && !reviewList.isEmpty()){
ParseObject review = reviewList.get(0);
if (review == null) {
txtview.setText("No Reviews yet");
} else {
rName = review.getString("Name");
rating = review.getString("Rating");
reviews = review.getString("review");
txtview.setText(rName + "\n" + reviews);
}
} else {
// reviewList is empty.
}
} else {
txtview.setText("No Reviews yet");
e.printStackTrace();
}
答案 1 :(得分:0)
您的应用显然会在ParseObject review = reviewList.get(0);
行崩溃,因为您无法从零长度数组中获取元素。
最简单的解决方案:在layout.xml
中的ListView之前添加带有错误消息文本的TextView。当列表为空时,将TextView可见性设置为VISIBLE,否则为GONE(或相应地更改显示的TextView中的文本。)
if (reviewList.size() == 0) {
txtview.setText("No Reviews yet");
} else {
ParseObject review = reviewList.get(0);
...
}