如何在Parse中处理空List

时间:2014-09-01 19:06:51

标签: android textview parse-platform

我正在使用解析,有时我的查询将返回一个空列表。我希望能够通过在文本视图中显示文本来处理这种情况。当列表返回对象时,代码似乎工作正常,但当列表为空时,代码似乎没有。不确定错误但应用程序崩溃了。

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);
    }
}

2 个答案:

答案 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);
        ...
    }