Создание listview из JSON в android

Я совершенно новичок в Android и в настоящее время пытаюсь создать listview из массива JSON, который был вытащен с моего сервера, я прочитал много учебников без везения, есть уникальный способ сделать это. Не могли бы вы, пожалуйста, указать некоторые ресурсы для начала.

я прочитала этой страница однако я застрял со следующим кодом:

import josecgomez.com.android.dev.webservice.objects.alerts;

давая мне "" как не определены ресурса:

public class AlertsAdapter extends ArrayAdapter<alerts>

спасибо, любая помощь очень сильно ценю!

5 ответов


JSON & listview буду работать так..

1.отображение списка элементов

Android SDK обеспечивает удобный способ быстрого отображения списка данных с помощью суперкласса под названием android.приложение.ListActivity. Это действие уже предоставляет ContentView, настроенный с помощью ListView, готов к использованию и заполнению данными.

теперь ListView необходимо предоставить данные для отображения вместе со средством отображения этих данных в строки. ListAdaptors предоставляют этот механизм и устанавливаются в базовом ListView ListActivity с помощью setListAdaptor.

Android SDK предоставляется адаптер (ArrayAdaptor) который знает, как обрабатывать массивы произвольных данных в ListViews (Android SDK также поставляется с несколькими другими ListAdaptors, например, адаптеры Курсора, которые могут помочь при подключении локального хранилища данных к ListView). Вам также необходимо предоставить адаптеру макет, который он может использовать для отображения элементов в каждой строке. В в приведенном ниже примере мы используем макет Android SDK, simple_list_item_1, который представляет собой одну текстовую метку–идеально подходит для укладки наших одиночных строк:

String[] elements = {"Line 1", "Line 2"};
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements));

2.настройки внешнего вида каждого элемента списка

для этого вам придется выйти за рамки встроенного макета и ArrayAdaptor и реализовать свой собственный вместо этого.

начните с создания класса ABC, который может использоваться для хранения как автора, так и содержимого в виде строк. Затем создайте и заполните объект тестовыми данными, которые будут отображаться в пользовательском элементе списка:

public class ABC {
    String userId;
    String pwd;
}

создайте XML-файл макета в /res/layout/list_item.xml для определения TextViews для отображения содержимого и автора в отдельных строках. Чтобы отобразить их один над другим, используйте LinearLayout, настроенный для отображения каждого элемента в нем вертикально (android:orientation="vertical").

после создания XML-файла плагин Android Eclipse автоматически добавит его в качестве ссылки на сгенерированный файл R. Этот файл R хранится в папке /gen вашего проекта и действует как мост между вашими XML-элементами и вашим Java-кодом. Он позволяет вашему Java-коду ссылаться на XML-элементы и файлы, созданные в папках /res. Файл, который вы только что создали, теперь можно ссылаться как R.layout.list_item в коде Java, как вы будете делать дальше в пользовательском адаптере списка.

создайте частный класс (внутри действия) под названием ListAdaptor какие подклассы ArrayAdaptor. Этот класс должен используется для хранения отображаемого ArrayList, а также для отображения объектов в TextViews вы создали в предыдущем макете.

это сопоставление переопределяет ListAdaptor и должно возвращать объект представления, заполненный содержимым данных в запрошенной позиции.

полная реализация пользовательского abcListAdaptor ниже:

private class abcListAdaptor extends ArrayAdapter<abc> {  
    private ArrayList<abc> abc;  
    public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) {  
        super(context, textViewResourceId, items);  
        this.abc = items;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        View v = convertView;  

        if (v == null) {  
            LayoutInflater vi = (LayoutInflater) getSystemService                          
(Context.LAYOUT_INFLATER_SERVICE);  
            v = vi.inflate(R.layout.list_item, null);  
        }  

        abc o = abc.get(position);  
        TextView tt = (TextView) v.findViewById(R.id.uid);  
        TextView bt = (TextView) v.findViewById(R.id.pwd);  
        tt.setText(o.userid);  
        bt.setText(o.pwd);  
        return v;  
    }  
}  

теперь метод onCreate можно отрегулировать для использования изготовленного на заказ переходники списка с создать тестовые данные, как показано ниже:

public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
abc a = new abc();  
a.userid = "tech";  
a.pwd = "android";  
ArrayList<abc> items = new ArrayList<abc>();  
items.add(a);  
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items);  
setListAdapter(adaptor);  
}  

3.доступ к удаленным службам и анализ данных

Android SDK содержит пакеты, направленные на упрощение доступа к API на основе HTTP. Классы Apache HTTP были включены и могут быть найдены под org.apache.http package. Вы будете использовать эти классы, вместе с org.json классы для анализа данных, возвращаемых с сервера.

мы можем создать отдельный метод в деятельности, которая делает запрос, анализирует результат и возвращает ArrayList объектов. Приведенный ниже код делает запрос и ищет полученный JSON array, который повторяется для извлечения каждого текста и элементов from_user.

ArrayList<abc> getDetail= new ArrayList<abc>();  
    try {  
        HttpClient hc = new DefaultHttpClient();  
        HttpGet get = new  
        HttpGet("<a href="http://your URL"></a>");  
        HttpResponse rp = hc.execute(get);  

        if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
            String result = EntityUtils.toString(rp.getEntity());  
            JSONObject root = new JSONObject(result);  
            JSONArray sessions = root.getJSONArray("results");  

            for (int i = 0; i < sessions.length(); i++) {  
                JSONObject session = sessions.getJSONObject(i);  
                abc a = new abc();  
                a.uid = session.getString("user");  
                a.pwd = session.getString("password");  
                getDetail.add(a);  
            }  
        }  
    } 

    catch (Exception e) {  
        Log.e("Activity", "Error loading JSON", e);  
    }  

теперь замените фиктивные данные, которые вы ранее использовали, вызовом метода load при построении пользовательского адаптера списка в методе onCreate.

abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load());  

4.создание адаптивных пользовательских интерфейсов

код его текущее состояние может привести к появлению диалогового окна приложение не отвечает (ANR), предлагая пользователю выйти из приложения. Это может произойти из-за длительной работы по удаленному запросу данных, выполняемых в таких методах, как onCreate.

длительные задачи никогда не должны выполняться в основном потоке приложения (который управляет циклом событий пользовательского интерфейса). Вместо этого они должны быть порождены в дочерние потоки для выполнения работа.

в то время как Java Thread класс может быть использован для этой задачи, есть осложнение в том, что как только длительная задача будет завершена, он обычно хочет изменить пользовательский интерфейс, чтобы сообщить о результатах (то есть отобразить список загруженных из запроса).

элементы пользовательского интерфейса могут изменять свое состояние только из основного потока, так как инструментарий Android UI не является потокобезопасным, поэтому фоновый поток должен возвращаться к основному потоку в для манипуляции интерфейс.

к счастью, Android SDK предоставляет удобный класс AsyncTask, который обеспечивает простой механизм для асинхронных задач для безопасного взаимодействия с потоком пользовательского интерфейса. Это достигается путем подкласса AsyncTask и переопределения метода doInBackground для выполнения длительной задачи, а затем переопределения onPostExecute для выполнения любых манипуляций с пользовательским интерфейсом.

когда AsyncTask создается (он должен быть создан в потоке пользовательского интерфейса) и выполняется, метод doInBackground вызывается в фоновом потоке. По завершении метод onPostExecute вызывается обратно в основной поток пользовательского интерфейса.

чтобы использовать это в своем приложении, вам нужно будет реализовать частный класс в Activity (например, пользовательский класс адаптера) под названием MyTask, который подклассы AsyncTask. Метод doInBackground можно переопределить содержимым предыдущего метода load.

вместо возвращаемого ArrayList вы поддерживаете экземпляр переменная в действии, так что данные могут быть разделены между частными классами. Затем в onPostExecute вы можете установить адаптер списка с данными, как это было сделано ранее в onCreate. Метод onCreate теперь просто создает объект MyTask и вызывает метод execute.

Лучшие Сайты на ListView с are этой & этой.

--

в отношении

TechEnd


вам нужно сохранить важные элементы вашего объекта JSON в новый объект, который вы создали сами.

допустим, ваш объект JSON дает вам ключи с именем, датой и номером телефона, вам нужен объект, содержащий такую информацию.

ваш listview будет принимать arrayadapter вашего нового типа, каждая ячейка listview будет содержать элементы пользовательского интерфейса (такие как textviews), которые заполняются информацией Вашего объекта

Это 3 шага процесс по крайней мере, и вам нужно решать решения для каждого из этих шагов индивидуально


попробуйте этот код в вашей деятельности сначала проанализировать данные json в строковый массив а затем установите адаптер Listview shoul в xml вашей деятельности

try
   {

   JSONArray jArray = new JSONArray(result);
   JSONObject jObj=new JSONObject ();
   String[] data=new String[jArray.length()]

       for(int i=0;i<jArray.length();i++)
       {
          jObj= jArray.getJSONObject(i);
          data[i]=json_data.getString("value");

       }

       GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data);
       listView1 = (ListView)findViewById(R.id.listView1);
       listView1.setAdapter(adapter);
}
catch(Exception e)
{
}

Я нашел хороший ресурс по теме. Теперь у меня есть список с данными JSON. Настоятельно рекомендуется Дор все новички. Спасибо ребята за помощь.


Я рекомендую вам выполнить следующие действия:

  1. получить данные из интернета и хранить его
  2. передайте сохраненные данные адаптеру
  3. установите адаптер в свой список

на первом шаге я предлагаю вам получить данные с помощью AsyncTask класса, который позволяет выполнять фоновые операции и публиковать результаты в UI-потоке, без необходимости манипулировать нитями и/или обработчиков. Во-вторых, вы должны проанализировать свой контент в соответствии с JSON структура, которую вы получаете. Наконец, передайте данные адаптеру для заполнения списка.