0

因此,基本上,代碼不會產生任何錯誤,但每當我嘗試運行它時,屏幕都會變爲空白。有人可以檢查我的代碼如下。使用recyclerView和Glide庫顯示來自Parse.com的圖像URL列表

我想我搞砸了recyclerView適配器?

THIS IS MY回收站適配器

public class recylerAdapter extends RecyclerView.Adapter<recylerAdapter.ViewHolder> { 

    private LayoutInflater inflater; 
    List<ImageUrl> data; 
    private Context context; 

    public recylerAdapter(Context context,List<ImageUrl> data){ 

     inflater=LayoutInflater.from(context); 
     this.data=data; 
     this.context=context; 

    } 

    @Override 
    public recylerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view=inflater.inflate(R.layout.custom_layout, parent, false); 

     ViewHolder holder= new ViewHolder(view); 

     return holder; 
    } 

    @Override 
    public void onBindViewHolder(final recylerAdapter.ViewHolder holder, final int position) { 

     ImageUrl current= data.get(position); 

     Glide.with(context) 
       .load(current.Url) 
       .override(100,100) 
       .into(holder.imageView); 


    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    class ViewHolder extends RecyclerView.ViewHolder{ 

     ImageView imageView; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      imageView=(ImageView)itemView.findViewById(R.id.imageView); 

     } 
    } 
} 

這是在MainActivity

public class MainActivity extends ActionBarActivity { 


    private recylerAdapter adapter; 

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


    ParseAnalytics.trackAppOpenedInBackground(getIntent()); 

    RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recyclerView); 
    recyclerView.setHasFixedSize(true); 

    adapter= new recylerAdapter(this,getData()); 

    recyclerView.setAdapter(adapter); 

    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 


    } 

public static List<ImageUrl> getData(){ 

    final List<ImageUrl> data= new ArrayList<>(); 

    ParseQuery<ParseObject>query= ParseQuery.getQuery("TestObject"); 

    query.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> objects, ParseException e) { 
      if (e==null && objects.size()>0){ 
       for (ParseObject object:objects){ 
        ParseFile file= object.getParseFile("image"); 

        ImageUrl current= new ImageUrl(); 

        current.Url=file.getUrl(); 

        data.add(current); 

       } 
      } 
     } 
    }); 

return data; 
} 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
    } 
} 

THI s是我的POJO類recyclerView數據

公共類的ImageUrl {

public String Url;

}

+0

也許您在設置適配器時列表爲空。嘗試在done方法中獲得回調時,嘗試在recyclerview上設置適配器。 –

+0

是的,它的工作。非常感謝你:) –

回答

1

findInBaackground異步方法,這意味着你不會有結果立即在方法返回時,但你必須等待。這是FindCallBack的目標:當結果可用時調用其done方法。

您的錯誤是,您在findInBackground返回後使用data列表的內容,但顯然是空的!

你可以做的是一個具有以下

public void loadData(){ 
final List<ImageUrl> data = new ArrayList<>(); 
ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); 
query.findInBackground(new FindCallback<ParseObject>() { 
    @Override 
    public void done(List<ParseObject> objects, ParseException e) { 
     if (e==null && objects.size()>0){ 
      for (ParseObject object:objects){ 
       ParseFile file= object.getParseFile("image"); 
       ImageUrl current= new ImageUrl(); 
       current.Url=file.getUrl(); 
       data.add(current); 
      } 
      adapter = new recylerAdapter(MainActivity.this, data); 
      recyclerView.setAdapter(adapter); 
     } 
    } 
}); 
} 

和你的onCreate更換您getData方法:

private RecyclerView recyclerView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ParseAnalytics.trackAppOpenedInBackground(getIntent()); 

     recyclerView=(RecyclerView)findViewById(R.id.recyclerView); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

     loadData(); 
} 

爲了提高UX您應該添加一個進度條,或只是一個「加載」文本來提醒用戶數據正在加載。在done回調中,您可以停止加載,並且數據對用戶可見

+0

它工作得很好!!非常感謝。我正在粗心 –

+0

你能否詳細說明你給我的這個陳述:「你的錯誤是你在findInBackground返回後使用數據列表的內容,但它顯然是空的!」我真的不明白,因爲在我的MAIN getData方法底部的ACTIVITY,我把返回數據是不是說'數據'是填充內容? –

相關問題