Ответ JSON в ListView

#android #json #sencha-touch #listitem

#Android #json #сенча-касание #listitem

Вопрос:

Я изучаю secha touch, я хочу создать страницу, на которой после ввода пользователем учетных данных для входа будет получен ответ JSON, который выглядит следующим образом

   {"items":[{"id":"78e221c8-bbc1-4754-8471-48c863886869","createTime":"2014-05-22T14:57:39.039Z","createUser":"Jon","status":"SAVED","changeTime":"2014-05-22T14:57:39.039Z","changeUser":"Jon","projectId":"63886869-bbc1-4754-8471-48c878e221c8","reportVersionNumber":"1","reportVersionName":"First Version","reportName":"FooBarBaz","reportHash":"qiyh4XPJGsOZ2MEAyLkfWqeQ"}],"totalItems":1

}
  

в настоящее время я создал страницу, на которой я использовал ListItem и отображал в ней элементы из простого массива, где данные были заданы в кодированном виде,
и использовал itemTpl, чтобы получить его
следующим образом <div class="arHeadline">{projectId}

мой текущий магазин

  data: [
                {
                    Headline: 'Panel',
                    Author: 'Sencha',
                    Content: 'Panels are most useful as Overlays - containers that float over your appl..'
            }
  

но я хочу получить данные из json, поэтому я создал хранилище JSON

 Ext.define('MobileChecklist.store.MyJsonPStore', {
    extend: 'Ext.data.Store',

    requires: [
        'MobileChecklist.model.MyModel',
        'Ext.data.proxy.JsonP',
        'Ext.data.reader.Json',
        'Ext.data.Field'
    ],

    config: {
        autoLoad: true,
        data: [
            {
                items: [
                    {
                        id: '78e221c8-bbc1-4754-8471-48c863886869',
                        createTime: '2014-05-22T14:57:39.039Z',
                        createUser: 'Jon',
                        status: 'SAVED',
                        changeTime: '2014-05-22T14:57:39.039Z',
                        changeUser: 'Jon',
                        projectId: '63886869-bbc1-4754-8471-48c878e221c8',
                        reportVersionNumber: '1',
                        reportVersionName: 'First Version',
                        reportName: 'FooBarBaz',
                        reportHash: 'qiyh4XPJGsOZ2MEAyLkfWqeQ'
                    }
                ],
                totalItems: 1
            }
        ],
        model: 'MobileChecklist.model.MyModel',
        storeId: 'MyJsonPStore',
        proxy: {
            type: 'jsonp',
            url: 'data/getPort.json',
            reader: {
                type: 'json',
                idProperty: 'id',
                rootProperty: 'items',
                totalProperty: 'totalItems',
                record: 'items'
            }
        },
        fields: [
            {
                name: 'reportName'
            },
            {
                name: 'projectId'
            }
        ]
    }
});
  

и моя модель

 Ext.define('MobileChecklist.model.MyModel', {
    extend: 'Ext.data.Model',

    requires: [
        'Ext.data.Field'
    ],

    config: {
        fields: [
            {
                mapping: 'items.reportName',
                name: 'reportName',
                type: 'string'
            },
            {
                mapping: 'items.projectId',
                name: 'projectId',
                type: 'string'
            }
        ]
    }
});
  

Я хочу декодировать ответ json и отобразить его в ListItem так, как я сделал со строковым массивом
как я могу это сделать, пожалуйста, помогите

РЕДАКТИРОВАТЬ: если я удаляю элементы из своего ответа json и делаю его похожим на массив, а не на объект, он работает и отображает его в виде списка

 [{"id":"78e221c8-bbc1-4754-8471-48c863886869","createTime":"2014-05-22T14:57:39.039Z","createUser":"Jon","status":"SAVED","changeTime":"2014-05-22T14:57:39.039Z","changeUser":"Jon","projectId":"63886869-bbc1-4754-8471-48c878e221c8","reportVersionNumber":"1","reportVersionName":"First Version","reportName":"FooBarBaz","reportHash":"qiyh4XPJGsOZ2MEAyLkfWqeQ"}],"totalItems":1}]
  

Комментарии:

1. В вашем хранилище установите data.items, и ваша проблема будет решена, и вам также не нужно сопоставлять данные в вашей модели.

2. что я должен установить для data.items? сопоставление или URL или что-то еще? я установил, что оба эти параметра мне не помогли @SujataChanda

3. @SujataChanda пожалуйста, посмотрите редактирование, и если вы что-нибудь получите, пожалуйста, помогите мне, спасибо

4. Итак, ваша проблема решена. Что вы хотите помимо этого?

5. моя проблема не решена, я не хочу изменять свой ответ JSON, если я его изменю, я получаю ответ, поэтому проблема в том, что itm не отображаются

Ответ №1:

Установите данные хранилища с data.items помощью вашего контроллера, например: —

        Ext.Ajax.request({
            url: someurl,
            params: {
                format: "json"
            },
            success: function(response) {
               Ext.getStore("MyJsonPStore").setData(response.items);
            },
            failure: function(err) {
               console.log("Error", err);
            }
        });
  

Это способ работы с данными json.

Нашел вашу проблему, измените свой прокси-сервер магазина на этот:-

  proxy: {
            type: 'rest',  //change it
            url: 'data/getPort.json',
            reader: {
                type: 'json',
                idProperty: 'id',
                rootProperty: 'items',
                totalProperty: 'totalItems'
            }
        }
  

Нет необходимости сопоставлять данные.

Комментарии:

1. Теперь я получил то, что вы хотите сказать, но для целей тестирования я напрямую предоставил ответ JSON, который я получаю в данных, который так же хорош, как и ответ на запрос ajax

2. теперь я хочу сопоставить его элементы с элементами представления списка, но элементы в ответе находятся внутри {items:[ в ответе, если я его выну, они будут сопоставлены

3. извините, но это мне не помогло, вы правильно поняли мой вопрос ?? если нет, пожалуйста, скажите мне, я объясню это вам надлежащим образом? потому что я не продвигаюсь вперед с этой проблемой, и мне нужна ваша помощь

4. Я запустил ваш код и, изменив приведенную выше строку и указав правильный путь для URL, успешно получил список. Я удалил свойство fields из хранилища и также удалил сопоставление модели, вместо этого сделал это fields: ["reportName", "projectId"] .

5. не могли бы вы отправить мне код, который вы могли бы успешно запустить?? потому что я все еще не могу запустить код с упомянутыми вами изменениями ..:(

Ответ №2:

Я никогда раньше не работал с платформой secha touch, но синтаксический анализ JSON довольно прост. Если у вас уже есть JSON, поступающий на ваше устройство, попробуйте это:

http://developer.android.com/reference/android/util/JsonReader.html

Затем создайте адаптер для вашего ListView