JSON Android ListView

Я строю этот веб-сервис на NetBeans,

package in.figures.on.mobile;

import db.koneksi.dbKoneksi;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import org.json.simple.JSONValue;

/**
 *
 * @author Setyadi
 */
@WebService()
public class AksesData {

    /**
     * Web service operation
     */
    @WebMethod(operationName = "Kategori")
    public String Kategori() {
        //TODO write your implementation code here:

        dbKoneksi con = new dbKoneksi();
        Statement statement;
        Properties properties;
        List list = new ArrayList();
        String sql = "SELECT idPrimary_key, kategori FROM kategori ";
        ResultSet hasil;
        String kategori = null;

        try{
            statement = con.getConnection().createStatement();
            hasil = statement.executeQuery(sql);
            while (hasil.next()) {
                properties = new Properties();
                properties.put("idPrimary_key", hasil.getString(1));
                properties.put("kategori", hasil.getString(2));
                list.add(properties);
            }
            kategori = JSONValue.toJSONString(list);
        }
        catch(Exception e){
        }

        return kategori;
    }


}

И вернуть JSON, как это

[{"idPrimary_key":"21ye21","kategori":"FirstCategory"},
{"idPrimary_key":"89oy89","kategori":"SecondCategory"},
{"idPrimary_key":"34ew34","kategori":"ThirdCategory"}]

И я пытаюсь использовать в Android ListView, как это, но все еще есть ошибки,

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);

        HttpTransportSE transportSE = new HttpTransportSE(URL);

        try {
            transportSE.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
            result = response.toString();

        } catch (Exception e) {
            e.printStackTrace();

        }

        String jsonAN = "{\"kat\":"+result+"}"; //try to build to be like this {"kat":[{blablablaJSON}]}
        String kategoriJSONList[][] = new String[99][2];
        String katList[] = new String[99]; //tobe shown on listview, derived from two dimensional array above.
        try {
            jsonObject = new JSONObject(jsonAN);
            jsonArray = jsonObject.getJSONArray("kat");

            for(int i=0; i < jsonArray.length() ; i++){
                kategoriJSONList[i][0] = jsonArray.getJSONObject(i).getString("idPrimary_key").toString();
                kategoriJSONList[i][1] = jsonArray.getJSONObject(i).getString("kategori").toString();
            }

            for(int i=0; i < jsonArray.length(); i++){
                katList[i] = kategoriJSONList[i][1];
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        ListView list  = (ListView) findViewById(R.id.listKategori);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                WebServiceActivity.this, android.R.layout.simple_list_item_1,katList
                );

        list.setAdapter(adapter);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long arg3) {
                final String kategori = (String) ((TextView)arg1).getText();
                Toast.makeText(WebServiceActivity.this, kategori,
                        Toast.LENGTH_LONG).show();
            }
        });

Нужна помощь, как использовать JSONValue, которые возвращаются, как показано выше, для отображения в виде ListView. Я получил стресс в эти дни. Заранее спасибо.

 Marcelo03 июл. 2012 г., 23:09
Хм ... хорошо, так что ваша ошибка не связана с проблемами с JSON. Можете ли вы дать больше информации о вашей ошибке (тип, logcat, исключения и т. Д.)? Можете ли вы опубликовать свой список код адаптера? :)
 AdityaSetyadi03 июл. 2012 г., 23:22
Я не знаю, как я могу предоставить информацию об ошибке, извините. Единственное, что наверняка, когда я пытаюсь запустить это, затмение показывает диалог, чтобы открыть перспективу, а затем принудительно закрыть. И я думаю, что это может быть проблема JSON, потому что я не знаю, как использовать его и анализировать в массив, код, который я пишу, просто пытается. Адаптер был там. Спасибо за вашу заботу Мтхама.
 Marcelo03 июл. 2012 г., 22:53
Можете ли вы сообщить, какая ошибка происходит? Основываясь на вашем коде, я могу дать предположение: насколько я знаю о JSON, объекты JSONObject всегда являются парными значениями, а синтаксис [{& quot; var1 & quot ;, & quot; var2 & quot ;, & quot; var3 & quot ;, .. .. ., & quot; varn & quot;}] несколько странен для меня и должен выглядеть как [{label1: value1, label2: value2, label3: value3, ..., labeln: valuen}]. Пожалуйста, проверьте это! ;-)
 AdityaSetyadi03 июл. 2012 г., 23:04
Извините, мой ложный, опечатка. [{"idPrimary_key": "21ye21", "kategori": "FirstCategory"}, {"idPrimary_key": "89oy89", "quot" & quot; "quot") " : "34ew34", "kategori": "ThirdCategory"}] Я редактировал.

Ответы на вопрос(1)

Решение Вопроса

олжны реализовать HttpRequest в закомментированной строке. Обратите внимание, что массив JSON жестко запрограммирован.

// the Adapter
public class ListViewAdapter extends BaseAdapter {

    private Context context = null;
    private List<String> fields = null;

    public ListViewAdapter(Context context, JSONArray arr) {
        this.context = context;
        this.fields = new ArrayList<String>();
        for (int i=0; i<arr.length(); ++i) {
            try {
                fields.add(arr.getJSONObject(i).toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public int getCount() {
        return fields.size();
    }

    @Override
    public Object getItem(int position) {
        return fields.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.itemlist, null);
        TextView txt = (TextView) convertView.findViewById(R.id.ItemList_txt);
        txt.setText(fields.get(position));
        return convertView;
    }

}

// the activity
public class ListViewActivity extends Activity {

    public final String result = "[{\"idPrimary_key\":\"21ye21\",\"kategori\":\"FirstCategory\"},{\"idPrimary_key\":\"89oy89\",\"kategori\":\"SecondCategory\"},{\"idPrimary_key\":\"34ew34\",\"kategori\":\"ThirdCategory\"}]";
    public final String obj = "{\"kat\":"+result+"}";

    private ListViewAdapter adapter = null;
    private ListView myList = null;
    private JSONArray items = new JSONArray();

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            if (msg.what == 0) { // server returned null, try again
                loadFields();
            } else if(msg.what == 1) { // error in json
                // do something to treat it
            } else if (msg.what == 2) { // ready to roll the list
                adapter = new ListViewAdapter(ListViewActivity.this, items);
                myList.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        }
    };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    myList = (ListView) findViewById(R.id.Lists_notificationsListview);
    loadFields();
}

private void loadFields() {
    new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            StringBuilder builder = new StringBuilder(obj);
            if (builder != null) {
                try {
                    // HERE, you should implement the HTTP request...
                    items = new JSONObject(obj).getJSONArray("kat");
                    handler.sendEmptyMessage(2);
                } catch (JSONException e) {
                    handler.sendEmptyMessage(1);
                }
            } else {
                handler.sendEmptyMessage(0);
            }
            Looper.loop();
        }
    }.start();
}

И XML-файлы:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:orientation="vertical"
        android:isScrollContainer="true">
        <ListView
            android:id="@+id/Lists_notificationsListview"
            android:layout_width="fill_parent" android:layout_height="match_parent">
        </ListView>
    </RelativeLayout>
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <TextView
        android:id="@+id/ItemList_txt"
        android:layout_width="fill_parent" android:layout_height="wrap_content"/>
</LinearLayout>

В результате он генерирует следующий вид:

enter image description here

Конечно, вы можете настроить его для создания списков, которые вы хотите, просто анализируя jsons! Надеюсь, что я каким-то образом помог ...

 AdityaSetyadi04 июл. 2012 г., 16:38
Я уже решил свою проблему, спасибо. Я попытался изменить адаптер на ArrayList & lt; String & gt ;, затем зациклив jsonarray и добавить из действия.
 27 мар. 2013 г., 06:17
Не могли бы вы объяснить, как останавливается цикл?
 AdityaSetyadi04 июл. 2012 г., 15:53
Спасибо, я попробовал это, и это хорошо работает. Но как я могу только хотеть использовать & quot; kategori & quot; быть в списке?
 24 мая 2013 г., 22:30
Остин, если вы ссылаетесь на Looper.loop, я бы хотел сказать, что это не «зацикливание». функция (например, для / while / foreach) сама. Looper - это механизм, который позволяет Android изменять пользовательский интерфейс, находясь в другом потоке. Android использует его основной поток, чтобы показать представление, но мы работаем с JSON в фоновом режиме. Обычно я использую эти строки (статический обработчик в сочетании с потоками) для загрузки / перезагрузки контента без задержек и / или ANR (приложение не отвечает). Если мы не используем это, мы можем получить CalledFromWrongThreadException. знак равно

Ваш ответ на вопрос