【问题标题】:Displaying list of image URLS from Parse.com with recyclerView and Glide library使用 recyclerView 和 Glide 库显示来自 Parse.com 的图像 URL 列表
【发布时间】:2015-12-23 18:12:38
【问题描述】:

所以基本上代码不会产生任何错误,但是每次我尝试运行它时我的屏幕都会变黑。有人可以检查我下面的代码。

我想我搞砸了 recyclerView 适配器?

这是我的回收站适配器

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);
  }
}

this 是我用于 recyclerView 数据的 POJO 类

公共类 ImageUrl {

公共字符串网址;

}

【问题讨论】:

  • 当您设置适配器时,您的列表可能为空。当你在 done 方法中获得回调时,尝试在 recyclerview 上设置适配器。
  • 是的,它奏效了。非常感谢:)

标签: android android-studio parse-platform android-recyclerview android-glide


【解决方案1】:

findInBaackground 是一个异步 方法,这意味着当方法返回时您不会立即获得结果,但您必须等待。这就是FindCallBack 的目标:当结果可用时调用它的done 方法。

你的错误是你在findInBackground返回之后使用了data列表的内容,但它显然是空的!

您可以做的是将您的 getData 方法替换为以下内容

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:

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();
}

要改善用户体验,您应该添加一个 ProgressBar 或仅添加一个“正在加载”文本以提醒用户数据正在加载。在done 回调中,您可以停止加载,数据对用户可见

【讨论】:

  • 效果非常好!!太感谢了。我粗心了
  • 你能否详细说明你给我的这个陈述:“你的错误是你在 findInBackground 返回后使用数据列表的内容,但它显然是空的!”我真的不明白,因为在 getData 方法底部的 MAIN ACTIVITY 中,我输入返回数据不是意味着“数据”中充满了内容吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多