2017-06-23 30 views
-1

我想通過使用Asynctask並通過RecyclerView.But的幫助將它設置在ImageView上從json中獲取圖像url。當我執行代碼時,它什麼都沒顯示,這裏是我的Json文件不使用asyncctask retreiving從json的圖像

[ 
    { 
    "albumId": 1, 
    "id": 1, 
    "title": "accusamus beatae ad facilis cum similique qui sunt", 
    "url": "http://placehold.it/600/92c952", 
    "thumbnailUrl": "http://placehold.it/150/92c952" 
    }, 
    { 
    "albumId": 1, 
    "id": 2, 
    "title": "reprehenderit est deserunt velit ipsam", 
    "url": "http://placehold.it/600/771796", 
    "thumbnailUrl": "http://placehold.it/150/771796" 
    } 

] 

這裏是我的MainActivity

public class MainActivity extends AppCompatActivity { 
ProgressDialog progressDialog; 
private RecyclerView.LayoutManager mLayoutManager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler); 
    mLayoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.addItemDecoration(new SimpleDivider(MainActivity.this)); 
    RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this); 
    recyclerView.setAdapter(recyclerViewAdapter); 
    new MyAsyncTask().execute(); 
} 


private class MyAsyncTask extends AsyncTask<Object, Object, String> { 


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

    } 

    @Override 
    protected String doInBackground(Object... params) { 
     StringBuffer chaine = new StringBuffer(""); 

     try { 
      URL url = new URL("https://jsonplaceholder.typicode.com/photos"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoInput(true); 
      urlConnection.connect(); 
      InputStream inputStream = urlConnection.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream)); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       chaine.append(line); 
      } 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String result = chaine.toString(); 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     JB jb = new JB(); 
     try { 
      JSONArray jArray = new JSONArray(result); 
      for (int i = 0; i < jArray.length(); i++) { 

       JSONObject jObject = jArray.getJSONObject(i); 
       String image = jObject.getString("url"); 
       jb.setAndroid_image_url(image); 
      } 

     } catch (JSONException e) { 
      Log.e("JSONException", "Error: " + e.toString()); 
     } 
    } 
} 

}

這裏是我的RecyclerAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
ArrayList<JB> jbs; 
private Context context; 


public RecyclerViewAdapter(Context context) { 
    this.context = context; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(context).inflate(R.layout.image_layout, parent, false); 
    return new ViewHolder(itemView); 

} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Picasso.with(context).load(jbs.get(position).getAndroid_image_url()).resize(120, 60).into(holder.imageView); 
} 

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

public class ViewHolder extends RecyclerView.ViewHolder { 
    ImageView imageView; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     imageView = (ImageView) itemView.findViewById(R.id.image); 

    } 
} 

}

我使用PICASO加載照片的ImageView

+0

你有沒有在主要活動本身的回收適配器? –

+0

將AsyncTask類更新爲'extends AsyncTask ' – Dennis

回答

1

我認爲你缺少的東西,我也做了一些改變。更新代碼

更新onPostExecute

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    ArrayList<JB> jb = new ArrayList<JB>(); 
    try { 
     JSONArray jArray = new JSONArray(result); 
     for (int i = 0; i < jArray.length(); i++) { 

      JSONObject jObject = jArray.getJSONObject(i); 
      String image = jObject.getString("url"); 
      jb.setAndroid_image_url(image); 
     } 

    // remove below code from your OnCreate 

     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler); 
     mLayoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.addItemDecoration(new SimpleDivider(MainActivity.this)); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this, jb); 
     recyclerView.setAdapter(recyclerViewAdapter); 

    } catch (JSONException e) { 
     Log.e("JSONException", "Error: " + e.toString()); 
    } 
} 

更新RecyclerView適配器構造

public RecyclerViewAdapter(Context context, ArrayList<JB> jb) { 
     this.context = context; 
     this.jbs= jb; 
    } 
+0

該方法來自哪裏 - > 'jb.setAndroid_image_url(image)'? – Dennis

+0

@Anirudh但是你沒有在任何地方設置適配器? –

+0

@丹尼它從我的javabean類 –

0

你必須創建JB類的ArrayList中,然後傳遞給recyclerview適配器。

ArrayList<JB> jbArray = new ArrayList(); 
    JB jb; 
    try { 
     JSONArray jArray = new JSONArray(result); 
     for (int i = 0; i < jArray.length(); i++) { 
      jb = new JB(); 
      JSONObject jObject = jArray.getJSONObject(i); 
      String image = jObject.getString("url"); 
      jb.setAndroid_image_url(image); 
      jbArray.add(jb); 
     } 
    recyclerViewAdapter = new RecyclerViewAdapter(this ,jbArray); 
    recyclerView.setAdapter(recyclerViewAdapter); 
    } catch (JSONException e) { 
     Log.e("JSONException", "Error: " + e.toString()); 
    } 

在RecyclerViewAdapter中,更改構造函數。

public RecyclerViewAdapter(Context context, ArrayList<JB> jbs) { 
    this.context = context; 
    this.jbs = jbs; 
} 
+0

仍然沒有得到任何東西!!!!! –

0

初始化您的數組

ArrayList<JB> yourarray = new ArrayList; 

@Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      JB jb = new JB(); 
      try { 
       JSONArray jArray = new JSONArray(result); 
       for (int i = 0; i < jArray.length(); i++) { 
        jb = new JB(); 
        JSONObject jObject = jArray.getJSONObject(i); 
        String image = jObject.getString("url"); 
        jb.setAndroid_image_url(image); 
        yourarray.add(jb); 


       } 

     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this,yourarray); 
     recyclerView.setAdapter(recyclerViewAdapter,yourarray); 

      } catch (JSONException e) { 
       Log.e("JSONException", "Error: " + e.toString()); 
      } 
    } 

更新您的適配器構造

public RecyclerViewAdapter(Context context,ArrayList<JB> jbs) { 
    this.context = context; 
    this.jbs=jbs; 
} 
+0

我使用了centerCrop(),但它仍然不能正常工作! –

+0

你是否將你的數組列表傳遞給適配器? –

+0

我該怎麼做? –

0

首先,你需要使用JB的ArrayList的,因爲在onPostExecute創建JB的一個對象,覆蓋每個循環迭代中的數據。

其次,您不要將數據集設置在適配器中。適配器始終在getItemCount方法中返回0。嘗試是這樣的:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
    private ArrayList<JB> jbs; 
    private Context context; 

    public setData(ArrayList<JB> list) { 
     jbs = list; 
     notifyDataSetChanged(); 
    } 

    <...> 

    @Override 
    public int getItemCount() { 
     return jbs != null ? jbs.size() : 0; 
    } 
} 

而且在onPostExecute:

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    ArrayList<JB> jbList = new ArrayList<>(); 
    try { 
     JSONArray jArray = new JSONArray(result); 
     for (int i = 0; i < jArray.length(); i++) { 
      JB curJb = new JB(); 
      JSONObject jObject = jArray.getJSONObject(i); 
      String image = jObject.getString("url"); 
      curJb.setAndroid_image_url(image); 
      jbList.add(curJb); 
     } 
    recyclerViewAdapter.setData(jbList); //don't forget make recycleViewAdapter available in this scope 
    } catch (JSONException e) { 
     Log.e("JSONException", "Error: " + e.toString()); 
    } 
} 
+0

爲什麼發生這種情況?它仍然沒有顯示任何東西 –

+0

Idk你的代碼有什麼問題。我向你展示你需要怎麼做。這是簡單的任務。嘗試閱讀[鏈接](https://developer.android.com/training/material/lists-cards.html?hl=ru)並且不要按ctrl + c,ctrl + v。 –