适配器未显示通过AsyncTask从Parse.com获取的数据

时间:2015-09-12 19:02:20

标签: android parse-platform android-asynctask adapter

我正试图通过AsyncTaskRunner从Parse.com获取一些数据。那么我打算用ListView来展示它们。我的自定义适配器代码附在下面:

public class ParseObjectAdapter extends BaseAdapter {

    Context mContext;
    LayoutInflater mInflater;
    List<ParseObject> parseArray;
    DBShoppingHelper mydb2;

    public ParseObjectAdapter(Context context, LayoutInflater inflater) {
        mContext = context;
        mInflater = inflater;
        parseArray = new ArrayList<>();
    }

    @Override
    public int getCount() {
        try {
            return parseArray.size();
        }
        catch (Exception e){
            return 0;
        }
    }

    @Override
    public ParseObject getItem(int position) { return parseArray.get(position); }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public String getObjectId(int position){
        return getItem(position).getObjectId();
    }

    public void sortByExpiry()
    {
        Comparator<ParseObject> comparator = new Comparator<ParseObject>() {
            @Override
            public int compare(ParseObject lhs, ParseObject rhs) {
            return ((Integer) lhs.getInt("expiresIn")).compareTo(rhs.getInt("expiresIn"));
            }
        };
        Collections.sort(parseArray, comparator);
        notifyDataSetChanged();
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {

        ViewHolder holder;

        // Inflate the custom row layout from your XML.
        convertView = mInflater.inflate(R.layout.list_item, null);

        // create a new "Holder" with subviews
        holder = new ViewHolder();
        holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name);
        holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry);

        // Taking care of the buttons
        holder.editButton = (Button) convertView.findViewById(R.id.button_edit);
        holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete);
        holder.shoppingListButton = (Button) convertView.findViewById(R.id.button_shopping);

        // hang onto this holder for future recycling
        convertView.setTag(holder);

        int expiry = getItem(position).getInt("expiresIn");

        if (expiry <= 0) {
            holder.itemExpiryView.setTextColor(Color.rgb(255,80,54));
        }

        // Set listener on the buttons
        holder.editButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Toast.makeText(mContext, "Edit Button CLicked", Toast.LENGTH_SHORT).show();

                ParseObject p = getItem(position);

                Intent goToAddItem = new Intent(mContext,ItemAddPage.class);
                goToAddItem.putExtra("catg_passed", p.getString("category"));
                goToAddItem.putExtra("update_flag", "YES");
                goToAddItem.putExtra("name passed", p.getString("itemName"));
                goToAddItem.putExtra("expires_in_passed", p.getString("expiresIn"));
                goToAddItem.putExtra("price_passed", p.getString("itemPrice"));
                mContext.startActivity(goToAddItem);
            }
        });

        holder.deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                ParseObject p = getItem(position);

                String android_id = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);
                ParseQuery itemToBeDeleted = new ParseQuery("Items");
                itemToBeDeleted.whereEqualTo("ACL", p.getACL());
                itemToBeDeleted.whereEqualTo("objectId", p.getObjectId());
                final Date deletionDate = new Date();

                itemToBeDeleted.findInBackground(new FindCallback<ParseObject>() {
                    @Override
                    public void done(List<ParseObject> Items, com.parse.ParseException e) {
                        if (e == null) {
                            Log.d("score", "Retrieved " + Items.size() + " scores");
                            if (Items.size() == 1) {
                                ParseObject itemToDelete = Items.get(0);
                                itemToDelete.put("deleted", true);
                                itemToDelete.put("deletedOn", deletionDate);
                                itemToDelete.saveEventually();
                            }
                        } else {
                            Log.d("score", "Error: " + e.getMessage());
                        }
                    }
                });

                parseArray.remove(p);
                sortByExpiry();
                notifyDataSetChanged();
                Toast.makeText(mContext, "Item deleted", Toast.LENGTH_SHORT).show();
            }
        });

        holder.shoppingListButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                ParseObject p = getItem(position);
                String add_to_list = p.getString("itemName");

                SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
                String add_date = sdf.format(new Date());
                System.out.println(add_date);
                mydb2.insertItem(add_to_list, add_date);
                Toast.makeText(mContext, "Item added to shopping list", Toast.LENGTH_SHORT).show();
            }
        });

        ParseObject p = getItem(position);
        String name2 = p.getString("itemName");
        Integer ex = p.getInt("expiresIn");
        String days_s ="";

        if (ex == 0) {
            days_s = "Expires today" ;
        }
        else if (ex == -1) {
            days_s = "Expired yesterday";
        }
        else if (ex < 0) {
            days_s = "Expired " + Math.abs(ex) + " days ago";
        }
        else if (ex == 1) {
            days_s = "Expires tomorrow";
        }
        else {
            days_s = "Expires in " + ex + " days";
        }

        holder.itemNameView.setText(name2);
        holder.itemExpiryView.setText(days_s);

        return convertView;
    }

    public void onClick(View v)
    {
        Intent viewItem = new Intent(v.getContext(), ItemAddPage.class);
        v.getContext().startActivity(viewItem);
    }

    private static class ViewHolder {
        public TextView itemNameView;
        public TextView itemExpiryView;
        public Button editButton;
        public Button deleteButton;
        public Button shoppingListButton;
    }

    public void updateData(List<ParseObject> arrayPassed) {
        // update the adapter's data set
        parseArray = arrayPassed;
        notifyDataSetChanged();
    }
}

这是我称之为的方法..

public class WelcomeParse extends Activity {

    ListView currentListView;
    List<ParseObject> currentList;

    ParseObjectAdapter itemAdder;

    String catg;
    DBShoppingHelper mydb2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        overridePendingTransition(R.anim.left_in, R.anim.right_out);
        setTheme(android.R.style.Theme_Holo_Light_DarkActionBar);

        setContentView(R.layout.activity_main);

        itemAdder = new ParseObjectAdapter(this, getLayoutInflater());

        mydb2 = new DBShoppingHelper(this);

        AsyncTaskAllItems runner = new AsyncTaskAllItems();
        runner.execute();
        // itemAdder.notifyDataSetChanged();

               this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }

    public class AsyncTaskAllItems extends AsyncTask<String, String, String> {
        private String resp;
        private Integer numItems = 0;

        @Override
        protected String doInBackground(String... params) {
            try {
                ParseQuery itemsAll = new ParseQuery("Items");
                itemsAll.whereEqualTo("owner", ParseUser.getCurrentUser().getUsername());
//                itemsByCategory.whereEqualTo("category", catg);

                itemsAll.findInBackground(new FindCallback<ParseObject>() {

                    @Override
                    public void done(List<ParseObject> Items, ParseException e) {
                        if (e == null) {
                            Log.d("score", "Retrieved " + Items.size() + " scores");
                            Log.d("owner", ParseUser.getCurrentUser().getUsername());
                            // HERE SIZE is 0 then 'No Data Found!'
                            numItems = Items.size();
                            if (numItems > 0) {
                                currentList = Items;
                            }
                        } else {
                            Log.d("score", "Error: " + e.getMessage());
                        }
                    }
                });

                resp = "Done";
            }
//            catch (InterruptedException e) {
//                e.printStackTrace();
//                resp = e.getMessage();
//            }
            catch (Exception e) {
                e.printStackTrace();
                resp = e.getMessage();
            }

            return resp;
        }

        @Override
        protected void onPostExecute(String result) {
            currentListView = (ListView) findViewById(R.id.all_list);
            itemAdder.updateData(currentList);
            if (numItems > 0) {
                itemAdder.sortByExpiry();
            }
            currentListView.setAdapter(itemAdder);
            // onWindowFocusChanged(true);
        }

        @Override
        protected void onPreExecute() {           
        }

        @Override
        protected void onProgressUpdate(String... text) {
        }
    }
}

我没有收到任何错误,日志正确显示了应该检索的项目数。但是视图没有得到相关数据的更新。 任何人请告诉我我错在哪里?你需要的任何其他东西,请告诉我。非常感谢。

1 个答案:

答案 0 :(得分:0)

更换后尝试

@Override
    protected void onPostExecute(String result) {
        currentListView = (ListView) findViewById(R.id.all_list);
        itemAdder.updateData(currentList);
        if (numItems > 0) {
            itemAdder.sortByExpiry();
        }
        currentListView.setAdapter(itemAdder);
        // onWindowFocusChanged(true);
    }

@Override
        protected void onPostExecute(String result) {
            currentListView = (ListView) findViewById(R.id.all_list);
            currentListView.setAdapter(itemAdder);
           itemAdder.updateData(currentList);
            if (numItems > 0) {
                itemAdder.sortByExpiry();
            }
        }