【问题标题】:Empty RecyclerView using fetched Data from parse.com使用从 parse.com 获取的数据清空 RecyclerView
【发布时间】:2015-06-12 05:59:55
【问题描述】:

我目前正在努力从我在parse.com 创建的class 中实现数据fetching。我想检索一个名为 "flyerDataFetch" 的对象及其所有元素以显示在 Recyclerview 中。

当我运行和编译程序时,我收到错误:

error:java.lang.NullPointerException at android.view.LayoutInflater.from(LayoutInflater.java:211) 
Error: RecyclerView﹕ No adapter attached; skipping layout. 

您能否检查我的代码并帮助确定我在尝试填充我的 RecyclerView 的过程中出错的地方?

MainActivity:

public class HomeScreen extends AppCompatActivity {
    private RecyclerView mRecyclerDrawer;
    private customAdapter mAdapter;
    private Context context;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_screen);
        setupDrawer();
        final List<Information> data = new ArrayList<>();
        Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxx");
        ParseQuery<ParseObject> query = ParseQuery.getQuery("flyerDataFetch");
        query.getInBackground("xWMyZ4YEGZ", new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject parseObject, com.parse.ParseException e) {
                if (e == null) {

                    Information information = new Information();
                    information.partyName = parseObject.getString("partyName");
                    information.partyPromoterName = parseObject.getString("partyCost");
                    information.partyCost = parseObject.getString("partyName");

                    information.flyerPic = parseObject.getParseFile("partyFlyerImage");
                    information.partyPromoterPic = parseObject.getParseFile("partyPromoterImage");

                    data.add(information);
                } else {
                    // something went wrong
                }
                mRecyclerDrawer = (RecyclerView) findViewById(R.id.drawerList);
                mRecyclerDrawer.setLayoutManager(new LinearLayoutManager(context));
                mAdapter = new customAdapter(context, data);
                mRecyclerDrawer.setAdapter(mAdapter);
            }
        });

    }

MyApplication:

 @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        ParseCrashReporting.enable(this);
        Parse.enableLocalDatastore(this);
        Parse.initialize(this, "xxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxx");
    }

CustomAdapter:

package com.example.jbobo_000.prac;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.parse.ParseImageView;

import java.util.Collections;
import java.util.List;

public class customAdapter extends RecyclerView.Adapter<customAdapter.MyViewHolder> {
    List<Information> data = Collections.emptyList();
    private LayoutInflater inflater;
    private Context context;
    public customAdapter (Context context,List<Information>data){
        this.context=context;
        inflater=LayoutInflater.from(context);
        this.data= data;
    }

   @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
       View view= inflater.inflate(R.layout.custom_row, parent, false);
       MyViewHolder holder = new MyViewHolder(view);
       return holder;
   }

    @Override
    public void onBindViewHolder(MyViewHolder holder,int position){
        Information current= data.get(position);
        holder.promoterNameText.setText(current.partyPromoterName);
        holder.costText.setText(current.partyCost);
        holder.partyNameText.setText(current.partyName);
        holder.flyerImage.setParseFile(current.flyerPic);
        holder.promoterImage.setParseFile(current.partyPromoterPic);
    }

    @Override
    public int getItemCount(){

        return data.size();
    }


    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView promoterNameText;
        TextView costText;
        TextView partyNameText;
        ParseImageView flyerImage;
        ParseImageView promoterImage;

        public MyViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            promoterImage = (ParseImageView) itemView.findViewById(R.id.promoterPicImage);
            flyerImage = (ParseImageView) itemView.findViewById(R.id.flyertImage);
            costText = (TextView) itemView.findViewById(R.id.costText);
            promoterNameText = (TextView) itemView.findViewById(R.id.promoterNameText);
            partyNameText = (TextView) itemView.findViewById(R.id.partyNameText);
        }

        @Override
        public void onClick(View v) {
            context.startActivity(new Intent(context, partyInformation.class));

        }
    }
}

Information:

package com.example.jbobo_000.prac;
import com.parse.ParseFile;
import com.parse.ParseImageView;

public class Information {
    public ParseFile flyerPic;
    public ParseFile partyPromoterPic;
    public String partyCost;
    public String partyName;
    public String partyPromoterName;



}

Logcat:

06-12 01:52:37.511    5432-5432/com.example.jbobo_000.prac E/RecyclerView﹕ No adapter attached; skipping layout
06-12 01:52:37.766    5432-5432/com.example.jbobo_000.prac D/AndroidRuntime﹕ Shutting down VM
06-12 01:52:37.766    5432-5432/com.example.jbobo_000.prac E/CrashReporting﹕ ParseCrashReporting caught a NullPointerException exception for com.example.jbobo_000.prac. Building report.
06-12 01:52:37.768    5432-5432/com.example.jbobo_000.prac E/CrashReporting﹕ Handling exception for crash
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
            at android.view.LayoutInflater.from(LayoutInflater.java:219)
            at com.example.jbobo_000.prac.customAdapter.<init>(customAdapter.java:25)
            at com.example.jbobo_000.prac.HomeScreen$1.done(HomeScreen.java:57)
            at com.example.jbobo_000.prac.HomeScreen$1.done(HomeScreen.java:38)
            at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:107)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-12 01:52:37.768    5432-5432/com.example.jbobo_000.prac D/CrashReporting﹕ Generating report file for crash
06-12 01:52:37.843    5432-5432/com.example.jbobo_000.prac D/CrashReporting﹕ Retrieving logcat output...
06-12 01:52:37.871    5432-5432/com.example.jbobo_000.prac D/CrashReporting﹕ Retrieving logcat output...
06-12 01:52:37.889    5432-5432/com.example.jbobo_000.prac D/CrashReporting﹕ Retrieving logcat output...
06-12 01:52:37.965    5432-5432/com.example.jbobo_000.prac W/Settings﹕ Setting stay_on_always has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value.
06-12 01:52:38.164    5432-5432/com.example.jbobo_000.prac V/CrashReporting﹕ About to start ReportSenderWorker from #handleException
06-12 01:52:38.172    5432-5603/com.example.jbobo_000.prac D/CrashReporting﹕ #checkAndSendReports - start
06-12 01:52:38.172    5432-5603/com.example.jbobo_000.prac D/CrashReporting﹕ Looking for error files in /data/data/com.example.jbobo_000.prac/files/com.parse/cr/reports
06-12 01:52:38.175    5432-5603/com.example.jbobo_000.prac D/CrashReporting﹕ Loading file 1434088357768-NullPointerException-1.stacktrace
06-12 01:52:38.185    5432-5603/com.example.jbobo_000.prac I/CrashReporting﹕ Sending file 1434088357768-NullPointerException-1.stacktrace
06-12 01:52:38.186    5432-5603/com.example.jbobo_000.prac D/CrashReporting﹕ Sending crash report to Parse...
06-12 01:52:38.193    5432-5603/com.example.jbobo_000.prac D/CrashReporting﹕ #checkAndSendReports - finish
06-12 01:52:38.265    5432-5432/com.example.jbobo_000.prac E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.jbobo_000.prac, PID: 5432
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
            at android.view.LayoutInflater.from(LayoutInflater.java:219)
            at com.example.jbobo_000.prac.customAdapter.<init>(customAdapter.java:25)
            at com.example.jbobo_000.prac.HomeScreen$1.done(HomeScreen.java:57)
            at com.example.jbobo_000.prac.HomeScreen$1.done(HomeScreen.java:38)
            at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:107)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-12 01:52:38.291    5432-5442/com.example.jbobo_000.prac W/art﹕ Suspending all threads took: 5.494ms

【问题讨论】:

    标签: java android json parse-platform android-recyclerview


    【解决方案1】:

    这是您应该更改的所有内容.. 首先您没有获得表(对象)flyerDataFetch 的所有数据,您只是获得了一个特定的列数据,其 id 为“xWMyZ4YEGZ”,您的查询应该是

    ParseQuery<ParseObject> query = ParseQuery.getQuery("flyerDataFetch");
        query.findInBackgroud(new FindCallBack<TableClass>(){
    
    
            @Override
            public void done(ParseObject List<TableName> list, com.parse.ParseException e) {
                if (e == null) {
    
           // GENERATE LOOP HERE AND GET ALL DATA OF LIST INTO YOUR LOCAL LIST WHICH YOU ARE PASSING TO ADAPTER OF RECYCLER VIEW
          //I am telling you to add loop so you can learn.. 
                    Information information = new Information();
                    information.partyName = parseObject.getString("partyName");
                    information.partyPromoterName = parseObject.getString("partyCost");
                    information.partyCost = parseObject.getString("partyName");
    
                    information.flyerPic = parseObject.getParseFile("partyFlyerImage");
                    information.partyPromoterPic = parseObject.getParseFile("partyPromoterImage");
    
                    data.add(information);
                } else {
                    // something went wrong
                }
    

    这将从表中获取所有数据并设置在您传递给适配器的列表中。这可能是您的 NullPointerException 的原因!

    另一件事是您获取图像的方式是错误的 您实际上需要执行查询并获取 bytes[] 数组,然后您可以在 ParseImageView 中进行设置

    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, options);
    myViewHolder.myImageView.setBitmapImage(bmp);
    

    您的 customAdapter 中也不需要上下文 .. 只需这样写

    private LayoutInflater inflater;
    
    public customAdapter (Context context,List<Information>data){
        inflater=LayoutInflater.from(context);
        this.data= data;
    }
    

    也在你的 MainActivity 类中..改变这个

     mRecyclerDrawer.setLayoutManager(new LinearLayoutManager(context));
    mAdapter = new customAdapter(context, data);
    

    到

      mRecyclerDrawer.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new customAdapter(getApplicationContext(), data);
    

    .. 声明您的以下数据

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

    在你的 MainActivity onCreate() 方法之前..

    希望对你有帮助!

    【讨论】:

    • 非常感谢您的反馈!我会执行你的更正!
    • 我更新了..进行更改..现在要正确获取文本只需实施必要的更改,您可以稍后查询图像..如果仍然有任何问题,请告诉我..
    • 我想通了,现在 recyclerview 中填充了您的帮助。谢谢!你介意详细介绍我如何填充我的两个图像视图吗?
    • 我已经给了你在 imagequery 中需要做的最重要的事情。n 然后放入 myViewHolder .. 只需要从 parse in bytes[] 中获取数据,然后像我一样将其转换为位图在回答中告诉你...
    【解决方案2】:

    context 为空。请在调用适配器之前为活动设置上下文值。 添加

    setContentView(R.layout.activity_home_screen);
    context=this;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多