2017-10-24 5 views
0

Ich benutze Gson und Universal Image Loader. benutzte ich dieses Projekt wie eine Vorlage (Sie müssen Version es laufen ändern, es in Tutorial zeigt): Tutorial: https://www.youtube.com/watch?v=X2mY3zfAMfM Link zu diesem Projekt: https://github.com/hishamMuneer/JsonParsingDemoListView in der ersten Aktivität, listView in der zweiten Aktivität; verschachtelte Json- keine Bilder in der zweiten ListView.

ich Bilder in verschachtelten Teil von JSON aded und erstellt Listview in zweite Aktivität, um es anzuzeigen.

{ 
    "movies": [ 
    { 
     "movie": "Avengers", 
     "cast": [ 
     { 
      "name": "Robert Downey Jr.", 
      "image": "www.mywebsite.com/img2.png" 
     }, 
     { 
      "name": "Chris Evans", 
      "image": "www.mywebsite.com/img3.png" 
     }, 
     { 
      "name": "Mark Ruffalo", 
      "image": "www.mywebsite.com/img4.png" 
     } 
     ], 
     "image": "https://jsonparsingdemo-cec5b.firebaseapp.com/jsonData/images/avengers.jpg" 
    }, 
    { 
     "movie": "Interstellar", 
     "cast": [ 
     { 
      "name": "Robert Downey Jr.", 
      "image": "www.mywebsite.com/img5.png" 
     }, 
     { 
      "name": "Chris Evans", 
      "image": "www.mywebsite.com/img6.png" 
     }, 
     { 
      "name": "Mark Ruffalo", 
      "image": "www.mywebsite.com/img7.png" 
     } 
     ], 
     "image": "https://jsonparsingdemo-cec5b.firebaseapp.com/jsonData/images/interstellar.jpg" 
    },... 

    ] 
} 

Erstes listView funktioniert ordnungsgemäß. In der Sekunde habe ich Fehler. Ich habe drei Möglichkeiten ausprobiert: 1. Mit BaseAdapter: Withouth Bilder füllt zweite listView mit textView korrekt und zeigt jede Bild im Detail Aktivität. Also drei Aktivitäten funktionieren gut (ohne Bilder in der zweiten). Aber wenn ich versuche, ListView mit Bildern zu füllen, habe ich Fehler: a. Standard-Weg verwenden: Problem mit Parse-während der Fehlersuche sehe ich in der Logcat die richtige Bild-URL, und seine Position während des Debuggens, aber archivieren Sie den Fehler danach.

’FATAL EXCEPTION: main 
java.lang.NumberFormatException: For input string: ”http://example.com/image14.png” 
at java.lang.Integer.parseInt(Integer.java:608) 
at java.lang.Integer.parseInt(Integer.java:643) 
at ….ListAdapter.getView(ListActivity) 

b. Verwenden von Universal Image Loader. , Versuch virtuelle Methode 'Leerer android.widget.ProgressBar.setVisibility (int)' auf einer Null-Objekt Referenz‘ Imageloader-Konfiguration mit null

werden kann nicht
    initialisiert aufzurufen
  1. ArrayAdapter Verwendung wie in der ersten Aktivität. Fehler: Versuch aus dem Feld 'android.widget.TextView com.example ... GridActivity $ ViewHolder.gridTitle' auf einer Null-Objekt Referenz

Können Sie mir helfen, zu lesen, bitte?

public class MovieModel { 
    private String name; 
    private String imgMovie; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getImgMenu() { 
     return imgMovie; 
    } 
    public void setImgMenu(String imgMenu) { 
     this.imgMovie = imgMenu; 
    } 


    @SerializedName("description") 
    private List<Descriptions> descriptions; 
    public List<Descriptions> getDescriptionsList() { 
     return descriptions; 
    } 
    public void setDescriptionsList(List<Descriptions> descriptions) { 
     this.descriptions = descriptions; 
    } 

    public static class Descriptions { 
     private String title; 
     private String image; 

     public String getTitle() { 
      return title; 
     } 

     public void setTitle(String title) { 
      this.title = title; 
     } 

     public String getImage() { 
      return image; 
     } 
     public void setImage(String image) { 
      this.image = image; 
     } 
    } 
} 

    public class ListActivity extends AppCompatActivity { 

    private ProgressBar progresBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 

     ListView listView = (ListView) findViewById(R.id.listView); 

     // getting the model from MainActivity send via extras 
     Bundle bundle = getIntent().getExtras(); 
     if (bundle != null) { 
      String json = bundle.getString("movieModel"); 
      MovieModel movieModel = new Gson().fromJson(json, MovieModel.class); 
      final List<MovieModel.Descriptions> result = movieModel.getDescriptionsList(); 

      GridAdapter gridAdapter = new GridAdapter(getApplicationContext(), result); 
      listView.setAdapter(gridAdapter); 

      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        MovieModel.Descriptions descriptionsModel = result.get(position); 

        Intent intent = new Intent(ListActivity.this, DetailActivity.class); 
        intent.putExtra("descriptionsModel", new Gson().toJson(descriptionsModel)); 
        startActivity(intent); 
       } 


      }); 
     } 
    } 

    public class GridAdapter extends BaseAdapter { 

     private LayoutInflater inflater; 
     private Context context; 
     private int resource; 
     private List<MovieModel.Descriptions> items; // You hate to use detailList 

     public GridAdapter(Context context, List<MovieModel.Descriptions> items) { 
      this.context = context; 
      this.items = items; 
      inflater = (LayoutInflater.from(context)); 
     } 

     @Override 
     public int getCount() { 
      return items.size(); //returns total of items in the list 
     } 

     @Override 
     public Object getItem(int position) { 
      return items.get(position); //returns list item at the specified position 
     } 
     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

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

       convertView = inflater.inflate(R.layout.list, null); 

//   Display text correctly when all below (with image) is comment 
      TextView listTitle = (TextView) convertView.findViewById(R.id.text); 
      listTitle.setText(items.get(position).getTitle()); 

      // 1a -Shows error because Parse when all bellow is comment 
      ImageView listImg = (ImageView) convertView.findViewById(R.id.image); 
      listImg.setImageResource(Integer.parseInt(items.get(position).getImage())); 

      // 1b - ImageLoader configuration can not be initialized with null 
      final ProgressBar progressBar = (ProgressBar) convertView.findViewById(R.id.progressBar); 
      ImageLoader.getInstance().displayImage(items.get(position).getImage(), listImg , new ImageLoadingListener() { 
       @Override 
       public void onLoadingStarted(String imageUri, View view) { 
        progressBar.setVisibility(View.VISIBLE); 
       } 
       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
        progressBar.setVisibility(View.GONE); 
       } 
       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        progressBar.setVisibility(View.GONE); 
       } 
       @Override 
       public void onLoadingCancelled(String imageUri, View view) { 
        progressBar.setVisibility(View.GONE); 
       } 
      }); 
      return convertView; 
     } 
    } 

activity_list

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.xtech.baselistview.ListActivity"> 

    <GridView 
     android:id="@+id/listView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:verticalSpacing="0dp" 
     android:horizontalSpacing="0dp" 
     android:stretchMode="columnWidth" 
     android:numColumns="2" 
     /> 
</RelativeLayout> 

list.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 


    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="centerCrop" /> 

     <ProgressBar 
      android:id="@+id/progressBar" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" /> 

    </FrameLayout> 
     <TextView 
      android:id="@+id/text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5dp" 
      android:gravity="center" /> 

</LinearLayout> 

Dritter Weg mit ArrayAdapter

public class ListActivity extends AppCompatActivity { 

    private ProgressBar progresBar; 
    private ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 

     listView = (ListView) findViewById(R.id.listView); 

     // getting the model from MainActivity send via extras 
     Bundle bundle = getIntent().getExtras(); 
     if (bundle != null) { 
      String json = bundle.getString("movieModel"); 
      MovieModel movieModel = new Gson().fromJson(json, MovieModel.class); 
      List<MovieModel.Descriptions> result = movieModel.getDescriptionsList(); 

      ListAdapter adapter = new ListAdapter(getApplicationContext(), R.layout.list, result); 
      listView.setAdapter(adapter); 
     } 
    } 

    public class ListAdapter extends ArrayAdapter { 

     private LayoutInflater inflater; 
     private Context context; 
     private int resource; 
     private List<MovieModel.Descriptions> items; 

     public ListAdapter(Context context, int resource, List<MovieModel.Descriptions> items) { 
      super(context, resource, items); 
      this.context = context; 
      this.resource = resource; 
      this.items = items; 
      inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() { 
      return items.size(); //returns total of items in the list 
     } 

     @Override 
     public Object getItem(int position) { 
      return items.get(position); //returns list item at the specified position 
     } 
     @Override 
     public long getItemId(int position) { 
      return position; 
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      ViewHolder holder = null; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = inflater.inflate(resource, null); 

       holder.listImg = (ImageView) convertView.findViewById(R.id.image); 
       holder.listTitle = (TextView) convertView.findViewById(R.id.text); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      final ProgressBar progressBar = (ProgressBar)convertView.findViewById(R.id.progressBar); 

      final ViewHolder finalHolder = holder; 
      ImageLoader.getInstance().displayImage(items.get(position).getImage(), holder.listImg, new ImageLoadingListener() { 

       @Override 
       public void onLoadingStarted(String imageUri, View view) { 
        progresBar.setVisibility(View.VISIBLE); 
       } 
       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
        progresBar.setVisibility(View.GONE); 
       } 
       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        progresBar.setVisibility(View.GONE); 
       } 
       @Override 
       public void onLoadingCancelled(String imageUri, View view) { 
        progresBar.setVisibility(View.GONE); 
       } 
      }); 
      holder.listTitle.setText(items.get(position).getTitle()); // 

      return convertView; 
     } 
    } 
    class ViewHolder { 
     private ImageView listImg; 
     private TextView listTitle; 
    } 
} 
+1

Unklar ... NumberFormatException ODER NullPointerException ?! Versuchen Sie nicht, mehrere Fragen in einem zu stellen! –

+0

Ich habe versucht, beide Konfigurationen mit BaseAdapter und ArrayAdapter hinzuzufügen. Ich habe Angst, wenn ich die gleiche Frage für ArrayAdapter und BaseAdapter hinzufügen wird einer von ihnen entfernt werden. Also der Fehler bei der Verwendung von ArrayAdapter ist: Fehler: Versuch, aus Feld zu lesen 'android.widget.TextView com.example ... GridActivity $ ViewHolder.gridTitle' auf eine Null-Objekt-Referenz – Maler

Antwort

0

Ich nehme an, dass Sie über Absicht korrekte URL vorbei so in Ihrem DetailActivity:

String flag; 
flag = i.getStringExtra("flag"); 
flagImg = (ImageView)findViewById(R.id.detailImg); 
ImageLoader imageLoader = ImageLoader.getInstance(); 
imageLoader.displayImage(flag, flagImg); 
Verwandte Themen