2014-11-28 3 views
0

Я создал демонстрационное приложение для отображения списка продуктов на экране. список продуктов поступает с удаленного сервера. в журналах я вижу данные, поступающие и хранящиеся в arralist, но каким-то образом они не привязаны к списку. Я делаю http-вызов в фоновом режиме, используя класс async.Listadapter не обязательные значения для listview

ниже активность на создание кода

ListAdapter adapter; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dbtest2_all_products); 
    Log.i("Entrey level=","entere dbtest2allproducts class"); 
    // Hashmap for ListView 
    productsList = new ArrayList<HashMap<String, String>>(); 

    // Loading products in Background Thread 
    new LoadAllProducts().execute(); 

    // Get listview 
    ListView lv = new ListView(DBtest2AllProducts.this); 

    // updating listview 
    lv.setAdapter(adapter); 

ниже postexecute метод

protected void onPostExecute(String file_url) { 
     // dismiss the dialog after getting all products 
     pDialog.dismiss(); 
    // ((BaseAdapter) adapter).notifyDataSetChanged(); 
     Log.i("before adapter",productsList.toString()); 
     adapter = new SimpleAdapter(
       DBtest2AllProducts.this, productsList, 
       R.layout.activity_dbtest2_list_items, new String[] { TAG_PID, 
         TAG_NAME}, 
       new int[] { R.id.pid, R.id.name }); 
      //setAdapter(adapter); 

хотя я считаю, так как есть некоторые синхронизации проблема с setAdapter (адаптер) шаг, но я, так как я новичок в android, поэтому не мог делать ставку на него. Я попытался вызвать метод setAdapter (адаптер) и adapter.notifyDataSetChanged() с помощью метода postexecute, но оба они вызывают ошибку, говоря, что «метод не определен для этого типа». Однако, если я применил адаптер к (BaseAdapter), то adapter.notifyDataSetChanged() doesn 't бросать любую ошибку, но я actully не знаю, какая разница делает это кастинг, а также кастинг не работает.

Ниже журнал кот

I/before adapter(32729): [{pid=1, name=iphone 4s}, {pid=2, name=samsung}] 

Пожалуйста, укажите, если вы видите какие-либо проблемы с кодом. Спасибо, что помогли заранее.

Ниже представлены макеты XML

all_product.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

    </LinearLayout> 

list_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 


    <TextView 
    android:id="@+id/pid" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:visibility="gone" /> 

    <!-- Name Label --> 
    <TextView 
    android:id="@+id/name" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:paddingTop="20dip" 
    android:paddingLeft="10dip" 
    android:textSize="17sp" 
    android:textStyle="bold" /> 

</RelativeLayout> 
+0

переместить lv.setAdapter (адаптер); в onPostExecute, после адаптера = новый SimpleAdapter (... –

+0

Я пробовал это, но он выдает ошибку «lv не может быть разрешен». Я думаю, что lv выходит за рамки метода post execute. –

ответ

0

Вы должны инициализировать вас адаптера перед установкой его в ListView. Сделать ListView глобальным и установить адаптер только после получения данных

ListView lv; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dbtest2_all_products); 
     Log.i("Entrey level=","entere dbtest2allproducts class"); 
     // Hashmap for ListView 
     productsList = new ArrayList<HashMap<String, String>>(); 

     // Loading products in Background Thread 
     new LoadAllProducts().execute(); 

     // Get list view from xml file 
     lv = findViewById(R.id.listview); 
     FrameLayout rootView = (FrameLayout) findViewById(android.R.id.content); 

     //Add this line to make sure your list is using the whole screen width 
     FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     rootView.addView(lv); 
    } 


    protected void onPostExecute(String file_url) { 
     // dismiss the dialog after getting all products 
     pDialog.dismiss(); 
     adapter = new SimpleAdapter(
      DBtest2AllProducts.this, productsList, 
      R.layout.activity_dbtest2_list_items, new String[] { TAG_PID, 
        TAG_NAME}, 
      new int[] { R.id.pid, R.id.name }); 
     lv.setAdapter(adapter); 
    } 
+0

Спасибо, Карлос! Я думаю, вы пропустили мои последние строки в вопрос. Я попробовал adapter.notifyDataSetChange() в post execute, но он выдает ошибку, говоря, что «метод не определен для типа listAdapter», и я попробовал второе решение, хотя он не вызвал никаких ошибок, но все же после исчезновения диалогового окна, я не вижу список продуктов :( –

+0

любая идея, почему notifyDataSetChange() не работает в post execute? –

+0

Я думаю, что я нашел вашу проблему. Является ли ваш ListView в файле activity_dbtest2_all_products.xml? Если это так, вы не инициализируетесь должным образом, и если вы добавив его программно, тогда вам также нужно добавить его в основное представление. Вот почему вы ничего не видите –

0

@Pawan Рават, после реализации вышеуказанного ответа, и если ваша уверенность в выполнении, переключите в Volley, в сетевой библиотеке, которая является более надежной, производительность сетевые вызовы быстрее с меньшим количеством кода. Подробнее читайте на http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

+0

Спасибо Трей, я обязательно посмотрю на него, как только я закончу решение проблемы! –

Смежные вопросы