9

mam użyć https://github.com/Diolor/Swipecards i działa to idealne rozwiązanie, jeśli dane są statyczne, ale to nie działa z AsyncTaskNie mógł ustawić SwipeFlingAdapterView z adapterem tablicy

Teraz chcę powiązać kartę z danymi JSON. ale nie działa.

public class HomeFragment extends Fragment { 

    private Context context; 

    private ArrayList<Productp> al; 
    private ArrayAdapter<Productp> arrayAdapter; 

    SwipeFlingAdapterView flingContainer; 

    ImageView img_product; 

    private ProgressDialog pDialog; 

    JSONParser jParser = new JSONParser(); 
    private static String url_all_products = "http://www.example.com/prod.php"; 

    // JSON Node names 
    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_PRODUCTS = "products"; 
    private static final String TAG_IMAGE = "url"; 

    JSONArray products = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_home, container, 
       false); 
     context = getActivity(); 

     initUI(rootView); 
     return rootView; 
    } 

    private void initUI(View view) { 

     flingContainer = (SwipeFlingAdapterView) view.findViewById(R.id.frame); 


     new Loaditems().execute(); 


    } 

    class Loaditems extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      pDialog = new ProgressDialog(context); 
      pDialog.setMessage("Loading products. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

     } 

     protected String doInBackground(String... args) { 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      params.add(new BasicNameValuePair("range", "1")); 

      JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", 
        params); 

      try { 
       // Checking for SUCCESS TAG 
       int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        products = json.getJSONArray(TAG_PRODUCTS); 

        al = new ArrayList<Productp>(); 

        for (int i = 0; i < products.length(); i++) { 

         JSONObject c = products.getJSONObject(i); 

         Productp pp = new Productp(); 

         pp.portal = c.getString(TAG_IMAGE); 

         al.add(pp); 
        } 
       } else { 

       } 

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

      } 

      return null; 
     } 

     protected void onPostExecute(String file_url) { 
      pDialog.dismiss(); 

      arrayAdapter = new ProductAdpater(context, al); 
      flingContainer.setAdapter(arrayAdapter); 

     } 
    } 

metoda adapter:

private class ProductAdpater extends ArrayAdapter<Productp> { 

     Context mContext; 

     public ProductAdpater(Context context, List<Productp> items) { 
      super(context, R.layout.row_homeview, items); 

      try { 
       this.mContext = context; 

      } catch (Exception e) { 

       e.printStackTrace(); 
      } 

     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return al.size(); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

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

      View view = convertView; 
      ViewHolder holder = null; 

      LayoutInflater mInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      if (view == null) { 
       view = mInflater.inflate(R.layout.row_homeview, parent, false); 
       holder = new ViewHolder(); 
       holder.imgIcon = (ImageView) view 
         .findViewById(R.id.addviewimage); 

       view.setTag(holder); 
      } else 
       holder = (ViewHolder) view.getTag(); 
      UrlImageViewHelper.setUrlDrawable(holder.imgIcon, 
        al.get(position).portal); 
      return view; 
     } 

     class ViewHolder { 

      ImageView imgIcon; 

     } 

    } 

    } 

klasa productp:

public class Productp { 


    public String portal=""; 
} 

Kiedy uruchomić powyższy kod. nic nie wyświetli.

Nawet ten kod działa poprawnie, ale nie wiąże danych z adapterem.

W programie logcat nie ma żadnego błędu.

Mam również debug kod.

the execution exit from 

public ProductAdpater(Context mcontext, ArrayList<Productp> items) { 
      super(mcontext, R.layout.row_homeview, items); 

      try { 
       context = mcontext; 
       // this.list = items; 
      } catch (Exception e) { 
       // TODO: handle exception 
       e.printStackTrace(); 
      } 

     } 

To nie wykonać metodę getView

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

Jak mogę rozwiązać ten?

+0

Spróbuj rozszerzenie 'BaseAdapter' raz zamiast' ArrayAdapter' –

+0

Próbowałem już. Ale wciąż nie jest w stanie powiązać danych. –

+0

OK. I czy na pewno tablica 'items' nie jest pusta, a co najmniej ma rozmiar> 1? –

Odpowiedz

5

Rozwiązałem to.

Właśnie wprowadziłem - arrayAdapter.notifyDataSetChanged(); onPostExecute.

Mój nowy kod aktualizowane na onPostExecute:

protected void onPostExecute(String file_url) { 
      pDialog.dismiss(); 

      arrayAdapter = new ProductAdpater(context, al); 
      flingContainer.setAdapter(arrayAdapter); 
      arrayAdapter.notifyDataSetChanged(); 
     } 

Stało się.

6

Wystarczy powiadomić aktualizowane zbiór danych do adaptera

za pomocą

notifyDataSetChanged();

notifyDataSetInvalidated()

+0

Rozwiązałem go już 6 godzin temu. –

+0

Tak, to jest w porządku, po prostu udzielam ci wyjaśnienia dla wywołania notifyDataSetChanged(); notifyDataSetInvalidated() –