【问题标题】:How to sort items in ListView as the order of items in Parse.com (android)如何按照 Parse.com 中的项目顺序对 ListView 中的项目进行排序(android)
【发布时间】:2014-04-25 14:06:52
【问题描述】:

我做了一个 ListView 并使用 CHOICE_MODE_MULTIPLE 和 simple_list_item_multiple_choice 来允许用户从列表中删除任何项目(通过取消选中项目旁边的复选框)。然后,此操作应仅将选中的项目保留在列表中。
我的问题是 ListView 出现的顺序与它存储在数据库中的顺序不同(即在创建记录的日期之前), 因此,当一个项目未选中时,它不会从数据库中删除。相反,一些其他记录被删除,因为 ListView 中的项目没有按照与数据库中相同的顺序出现。每次刷新页面时,ListView 中项目的顺序都会重新排列。 如何始终让项目以与数据库中相同的顺序出现在 ListView 中? 我想指出我使用过:

queryProducts.orderByAscending("createdAt");

但是,由于某种原因,它没有正确排序。

这是我的代码:

package com.androidbegin.parselogintutorial;

import java.util.ArrayList;
import java.util.List;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;
import com.parse.SaveCallback;

import android.app.ActionBar.Tab;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class OrderListActivity extends Activity{
    @Override
    public void onBackPressed() {
        Log.d("CDA", "onBackPressed Called");
    Intent setIntent = new                        Intent(getApplicationContext(),TabsActivity.class);
    startActivity(setIntent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
    case R.id.action_contactus:
        String [] to = new String[]{"Shatha-sa@hotmail.com", "",};
        String [] subject = new String[]{"Test Email - Smart Shopping System",};
        Intent emailActivity = new Intent(Intent.ACTION_SEND);
        //set up the recipient address
        emailActivity.putExtra(Intent.EXTRA_EMAIL, to );
        //set up the email subject
        emailActivity.putExtra(Intent.EXTRA_SUBJECT, subject);
        //you can specify cc addresses as well
        emailActivity.putExtra(Intent.EXTRA_CC, new String[]       {"nabuhossain@stu.kau.edu.sa"});
        emailActivity.setType("message/rfc822");
        startActivity(Intent.createChooser(emailActivity, "Select your Email Provider :"));
        return true;

    case R.id.action_logout:
        ParseUser.logOut();
        Intent intent = new Intent(this, FirstScreenActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
        return true;


    default:
        return super.onOptionsItemSelected(item);
    }
}

ListView OrderItem;
Button button_confirmOrder;
private ProgressBar pb =null;
ParseObject u = new ParseObject("OrderItem");
int counter = 0;
int i;
int m = 0;


public void onStart() {
    super.onStart();
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.orderslist);

    OrderItem = (ListView) findViewById(R.id.listV_displayorders);
    button_confirmOrder = (Button) findViewById(R.id.button_confirmorder);

    pb = (ProgressBar) findViewById(R.id.progressBar1);
    pb.setVisibility(View.VISIBLE);


    ParseQuery<ParseObject> queryId = new ParseQuery<ParseObject>("orders");
    queryId.whereEqualTo("Customer", ParseUser.getCurrentUser());       
    queryId.findInBackground(new FindCallback<ParseObject>() {
        public void done(final List<ParseObject> ParseObject,final ParseException e) {
            for (final ParseObject parseObject : ParseObject) {    
                final ParseQuery<ParseObject> queryProducts = new        ParseQuery("OrderItem");
                queryProducts.whereEqualTo("OrderID", parseObject.getObjectId());
                queryProducts.orderByAscending("createdAt");
                queryProducts.findInBackground(new FindCallback<ParseObject>() {
                    public void done(final List<ParseObject> ParseObject1, final ParseException e) {
                        if(ParseObject1.size() != 0){   
                            if (e == null) {
                                final ArrayAdapter<String>        listAdapter = new ArrayAdapter<String>(OrderListActivity.this,
                                        android.R.layout.simple_list_item_multiple_choice);

                                for (i = 0; i < ParseObject1.size(); i++) {
                                    u = ParseObject1.get(i);
                                    final int Quantity = u.getInt("Quantity");

                                    ParseQuery<ParseObject> query = new       ParseQuery<ParseObject>("products");
                                    query.whereEqualTo("productID", u.get("Barcode"));
                                    query.findInBackground(new   FindCallback<ParseObject>() {
                                        public void done(List<ParseObject> ParseObject, ParseException e) {
                                            if (e == null) {
                                                for (final ParseObject parseObject : ParseObject) {
                                                    final String ProductName = parseObject.get("productName").toString();
                                                    final int Price = parseObject.getInt("price");
                                                    int TotalPrice = Quantity * Price;
                                                    listAdapter.add(ProductName + "  " + TotalPrice + " $ " + "Q. " + Quantity);

                                                    counter++;
                                                    OrderItem.setAdapter(listAdapter);
                                                    OrderItem.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

                                                    for (m = 0; m <= ParseObject1.size(); m++) {
                                                        OrderItem.setItemChecked(m , true);
                                                    }
                                                    pb.setVisibility(View.INVISIBLE);

                                                }}}});


                                    button_confirmOrder.setOnClickListener(new OnClickListener() {  
                                        //SparseBooleanArray checkedPositions = OrderItem.getCheckedItemPositions();
                                        public void onClick(View v) {                                     

                                            int count=0;
                                            for(int j=0; j < ParseObject1.size() ; j++){
                                                if (OrderItem.isItemChecked(j) == false)
                                                    count++;
                                            }
                                            if(count == ParseObject1.size()){
                                                Toast.makeText(getApplicationContext(),"Please select a product",Toast.LENGTH_LONG).show();
                                                return;}
                                            else{
                                                SparseBooleanArray checkedPositions = OrderItem.getCheckedItemPositions();
                                                for(int j=0; j < counter ; j++) {
                                                    if(checkedPositions.get(j) == false) {
                                                        // UNCHECKED
                                                        final int n = j;
                                                        ParseQuery<ParseObject> queryId = new ParseQuery<ParseObject>("orders");
                                                        queryId.whereEqualTo("Customer", ParseUser.getCurrentUser());
                                                        queryId.findInBackground(new FindCallback<ParseObject>() {
                                                            public void done( List<ParseObject> ParseObject,  ParseException e) {
                                                                final ParseQuery<ParseObject> queryProducts = new ParseQuery("OrderItem");

                                                                queryProducts.whereEqualTo("OrderID", parseObject.getObjectId());
                                                                queryProducts.findInBackground(new FindCallback<ParseObject>() {
                                                                    public void done( List<ParseObject> ParseObject,  ParseException e) {
                                                                        int r = n;
                                                                        ParseObject.get(n).deleteInBackground();
                                                                        listAdapter.notifyDataSetChanged();
                                                                    }});
                                                            }});
                                                    }}
                                                Intent i = new Intent(getApplicationContext(),locationsActivity.class);
                                                startActivity(i);
                                                return;
                                            }}});
                                }}   
                        }else{  
                            final ArrayAdapter<String> listAdapter1 = new ArrayAdapter<String>(OrderListActivity.this,
                                    android.R.layout.simple_list_item_1);
                            listAdapter1.add("There are no results.");
                            OrderItem.setAdapter(listAdapter1);
                            pb.setVisibility(View.INVISIBLE);
                        }}});
            }}});
}}

【问题讨论】:

    标签: java android eclipse android-listview parse-platform


    【解决方案1】:

    我认为问题不在于项目的顺序。

    要从多选 ListView 中获取所选项目,您需要正确处理 SparseBoolean 数组。 SparseBoolean 数组基本上是一个键值对数组,

    所以而不是

    if(checkedPositions.get(j) == false) {

    你应该这样做

    if(checkedPositions.get(checkedPositions.keyAt(j)) == false) {

    How to get Selected items from Multi Select List View

    【讨论】:

    • 我做到了,但它也不起作用 :( ,列表中的项目保存为来自 parse.com 多列的字符串,所以我无法将列表中的项目与数据库中的对象,除非我与地点进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2020-01-30
    • 2020-08-28
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多