0

Я новичок в android и застрял на одном шаге, так что действительно нужна помощь кому-то. I m код для небольшой части программы, которая должна анализировать локальный файл Json и отправлять его в действие. Изображение декодируется с Base64 в Bitmap и передается в CustomAdapter (расширяет базовый адаптер). Я проверяю шаги программы с Log. AsyncTask делает все правильно, но в методе «Oncreate view» кажется, что ничего не запускает. Это мой код. Я действительно не знаю, в чем проблема, помогите!Не работает oncreateview в Fragment после AsyncTask

Мои 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

Подсказка: Если вы расширяете ArrayAdapter вместо BaseAdapter, то вам не нужно будет реализовать методы GetItem, getItemId или GetCount. –

+0

@ cricket_007 Хорошо! Но теперь у меня есть новая проблема ... Теперь не всегда появился этот список. View (Fragment) создает, все хорошо, кроме этого listview .. я переехал 'update post' в' oncreate', 'onactivitycreated' и т. Д. , но no listview (после первого запуска все хорошо. Если компилировать снова - нет listview .. –

+0

Я не уверен, что вы имеете в виду, но в onPostExecute вы очищаете список на каждой итерации этого цикла. В принципе, убедитесь, что есть на самом деле данные в этом ArrayList, а затем вызвать 'notifyDatasetChanged' –

ответ

0

Ваш адаптер не имеет никакого товара Так Пожалуйста, измените это на адаптер

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

А также называют updatePost() Methed в onActivityCreated() Mehhed

+0

Кроме того,' bitArray' нуждается в инициализации в onCreate, в противном случае это изменение выдает NPE –

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