0

Ich bin neu in Android und fest in einem Schritt, so brauche wirklich jemand Hilfe. Ich Code für kleines Stück des Programms, das JSON lokale Datei analysieren sollte, und posten es auf Aktivität. Bilddekodierung mit Base64 nach Bitmap und Übergabe an CustomAdapter (erweitert den Basisadapter). Ich überprüfe die Programmschritte mit Log. AsyncTask machen alle korrekt, aber in der Methode "Oncreate view" scheint nichts zu laufen. Sie ist mein Code. Ich habe wirklich keine Ahnung, was das Problem, Hilfe!läuft nicht oncreateview bei Fragment nach AsyncTask

Mein MainFragment + AsyncTask

public class MainFragment extends Fragment { 

ArrayList<Bitmap> bitArray; 

public MainFragment() { 
} 

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

    ListView listview = (ListView)rootView.findViewById(R.id.listViewPost); 
    Log.v("Pl","1"); 
    listview.setAdapter(new CustomListAdapter(getContext(), bitArray)); 
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      Toast.makeText(getActivity(), "YESS", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return rootView; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
} 

private void updatePost() { 

    FetchPosterTask postTask = new FetchPosterTask(getActivity()); 
    postTask.execute("uk_news.json"); 

} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    updatePost(); 
} 

class FetchPosterTask extends AsyncTask<String, Void, ArrayList<Bitmap>> { 
    private final String LOG_TAG = FetchPosterTask.class.getSimpleName(); 
    private Context context; 


    public FetchPosterTask (Context myContext) { 
     this.context = myContext; 
    } 

    @Override 
    protected ArrayList<Bitmap> doInBackground(String... params) { 

     if(params.length ==0){ 
      return null; 
     } 

     String json = null; 

     try { 
      json = getJson(params[0]); 

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

     try { 
      String[] masPst = getPosterfromJsonAsString(json); 
      ArrayList<Bitmap> result =decodeImageToBitmap(masPst); 

      return result; 
     }catch (JSONException e){ 
      Log.e(LOG_TAG, "Place 5", e); 
     } 

     return null; 
    } 

    private String getJson(String filename) throws IOException{ 
     InputStream is = this.context.getAssets().open(filename); 
     int size = is.available(); 
     byte[] buffer = new byte[size]; 
     is.read(buffer); 
     is.close(); 
     return new String(buffer); 

    } 

    private String[] getPosterfromJsonAsString(String posterJson) throws JSONException { 
     final String OWM_NFO = "nfo"; 
     final String OWM_NWS = "nws"; 
     final String OWM_PST = "pst"; 


     JSONObject imageJson = new JSONObject(posterJson); 
     JSONObject nfoArray = imageJson.getJSONObject(OWM_NFO); 
     JSONArray nwsArray = nfoArray.getJSONArray(OWM_NWS); 

     String[] resultStr = new String[nwsArray.length()]; 

     for(int i =0; i<nwsArray.length(); i++){ 
      JSONObject pst = nwsArray.getJSONObject(i); 
      String im = pst.getString(OWM_PST); 

      resultStr[i] = im; 
     } 

     return resultStr; 

    } 


    public ArrayList<Bitmap> decodeImageToBitmap (String[] base64Image) { 
     ArrayList<Bitmap> bitmapArrayList = new ArrayList<Bitmap>(); 
     for(int i =0; i<4; i++) { 
      byte[] decodedString = Base64.decode(base64Image[i], Base64.DEFAULT); 
      Bitmap base64Bitmap = BitmapFactory.decodeByteArray(decodedString, 0, 
        decodedString.length); 
      bitmapArrayList.add(i, base64Bitmap); 
     } 
     return bitmapArrayList; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Bitmap> bitmapArrayList) { 
     if(bitArray == null){ 
      bitArray = new ArrayList<>(bitmapArrayList); 
     } 
     else{ 
      for(Bitmap bit: bitmapArrayList){ 
       bitArray.clear(); 
       bitArray.add(bit); 
      } 
     } 
    } 
} 

}

CustomListAdapter

public class CustomListAdapter extends BaseAdapter { 
private final String LOG_TAG = CustomListAdapter.class.getSimpleName(); 
private ArrayList<Bitmap> bitmapArrayList; 
private LayoutInflater layoutInflater; 

public CustomListAdapter(Context context, ArrayList<Bitmap> bitmapArrayList) { 
    this.bitmapArrayList = bitmapArrayList; 
    this.layoutInflater = LayoutInflater.from(context); 
} 

@Override 
public int getCount() { 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    return bitmapArrayList.get(position); 
} 
@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    if(convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.list_post_item, null); 

     holder = new ViewHolder(); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.list_item); 
     convertView.setTag(holder); 
     Log.v(LOG_TAG,"1"); 
    } 
else { 
    holder = (ViewHolder) convertView.getTag(); 
     Log.v(LOG_TAG,"2"); 
} 
    Log.v(LOG_TAG,"3"); 
    holder.imageView.setImageBitmap((Bitmap)getItem(position)); 
    Log.v(LOG_TAG,"4"); 

    return convertView; 
} 

static class ViewHolder { 
    ImageView imageView; 

} 

}

Layouts 
list_post_item 

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

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/list_item"/> 

</LinearLayout> 

fragment main 

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

     <ListView 
      android:layout_width="273dp" 
      android:layout_height="wrap_content" 
      android:id="@+id/listViewPost" /> 

</LinearLayout> 
+0

Tipp: Wenn Sie ArrayAdapter verlängern statt BaseAdapter, dann würden Sie nicht die getItem, GetItemID oder getCount Methoden implementieren müssen. –

+0

@ cricket_007 Ok! Aber jetzt habe ich neues Problem ... Nun erschien nicht immer diese Listview .. View (Fragment) erstellt, alles ist gut, mit Ausnahme der Listview .. Ich bewegte 'update post' zu' oncreate', 'onactivitycreated' usw. aber keine listview (nach dem ersten Start, alles ist gut. Wenn neu kompilieren - keine Listenansicht .. –

+0

Ich bin mir nicht sicher, was du meinst, aber in onPostExecute, löschen Sie die Liste in jeder Iteration dieser for-Schleife. Grundsätzlich, stellen Sie sicher es tatsächlich Daten in dieser Arraylist ist und rufen Sie dann 'notifyDatasetChanged' –

Antwort

0

Ihr Adapter hat noch keine Artikel so dass beim Adapter ändern Bitte

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

Und rufen auch in onActivityCreated() methed updatePost() Mehhed

+0

Außerdem muss' bitArray' in onCreate initialisiert werden, sonst löst diese Änderung eine NPE –

Verwandte Themen