简体   繁体   English

recyclerView中发生错误

[英]Error occur in recyclerView

This app is getting data directly from API. 此应用程序直接从API获取数据。 When it goes to run such type of error occurs. 当它运行时,会发生此类错误。 Basically I think the error occurs in the getItemCount() method but i'm not be able to resolve the problem. 基本上,我认为该错误发生在getItemCount()方法中,但我无法解决问题。 I've attached the error file and the whole code.I shall be thankful if you can resolve the error. 我已经附上了错误文件和整个代码。如果您能解决错误,请多谢。

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.techbrightsoft.database.MyRecyler.getItemCount(MyRecyler.java:36) at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3603) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3103) at android.view.View.measure(View.java:20151) at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934) at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973) at android.view.View.measure(View.java:20151) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.java:20151) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) at android.support.v7.widget.Act java.lang.NullPointerException:尝试在android.support的com.techbrightsoft.database.MyRecyler.getItemCount(MyRecyler.java:36)的空对象引用上调用接口方法'int java.util.List.size()'。 v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3603)在android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3103)在android.view.View.measure(View.java:20151)在android android上的.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934)在android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973)在android.view.View.measure(View.java:20151)在android。 view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)在android.widget.FrameLayout.onMeasure(FrameLayout.java:194)在android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)在android.view android.support.v7.widget.Act上的.View.measure(View.java:20151)在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) ionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400) at android.view.View.measure(View.java:20151) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:20151) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) at android.widget.LinearLayout.measureVertical(LinearLayout.java:747) at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) at android.view.View.measure(View.java:20151) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3158) at android.view.View.measure(View.java:20151) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2594) at android.view.ViewRootImpl.measureHierarchy(Vi ionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400)位于android.view.View.measure(View.java:20151)位于android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)位于android.widget.FrameLayout.onMeasure(FrameLayout) .java:194),位于android.view.View.measure(View.java:20151),位于android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330),位于android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)在android.widget.LinearLayout.measureVertical(LinearLayout.java:747)在android.widget.LinearLayout.onMeasure(LinearLayout.java:629)在android.view.View.measure(View.java:20151)在android.view。 android.widget.FrameLayout.onMeasure(FrameLayout.java:194)的com.android.internal.policy.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:3158)的ViewGroup.measureChildWithMargins(ViewGroup.java:6330) android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2594)的.View.measure(View.java:20151)android.view.ViewRootImpl.measureHierarchy(Vi ewRootImpl.java:1549) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1841) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) at android.view.Choreographer.doCallbacks(Choreographer.java:695) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7224) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) ewRootImpl.java:1549)处android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1841)处android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)处android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:1437) :7397),位于android.view.Choreographer $ CallbackRecord.run(Choreographer.java:920),位于android.view.Choreographer.doCallbacks(Choreographer.java:695),位于android.view.Choreographer.doFrame(Choreographer.java:631)在android.os.Handler.dispatchMessage(Handler.java:95)在android.os.Handler.handleCallback(Handler.java:739)在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:906)处。 os.Looper.loop(Looper.java:158)在android.app.ActivityThread.main(ActivityThread.java:7224)在com.android.internal.os的java.lang.reflect.Method.invoke(Native Method)。 ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

  public class MyRecyler extends RecyclerView.Adapter<MyRecyler.MyHolder> {
  private Context context;
   private ArrayList<String> names;

    public MyRecyler(Context context, ArrayList<String> names) {
        this.context = context;
        this.names = names;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(this.context);
        View view = inflater.inflate(R.layout.names, parent, false);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.name.setText(this.names.get(position));
    }

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

    public class MyHolder extends RecyclerView.ViewHolder {
        TextView name;

        public MyHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
        }
    }


    public class MainActivity extends AppCompatActivity {
    public static ArrayList<String> authors_names ;
    RecyclerView recyclerView;
    EditText editText;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerView);
        // Downloading Data From Internet
        DownloadingData downloadingData = new DownloadingData();
        downloadingData.execute("https://newsapi.org/v1/articles?source=the-next-web&sortBy=latest&apiKey=a301a9e90c774b4ebf7eb21000cdbdef");


        // RecyclerView Set
        MyRecyler recyler = new MyRecyler(MainActivity.this,authors_names);
        recyclerView.setAdapter(recyler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyler.notifyDataSetChanged();
    }
}

It seems this code does not properly initialize authors_names . 似乎此代码未正确初始化authors_names If I have guess your code logic correctly, you want to fill authors_names with result from downloadingData . 如果我猜对了您的代码逻辑,那么您想用downloadingData结果填充authors_names Generally, passing that list to your adapter is a bad practice. 通常,将该列表传递给适配器是一种不好的做法。

My suggestion is initializing names with an empty list and define a addAll() method for updating its content. 我的建议是用一个空列表初始化names ,并定义一个addAll()方法来更新其内容。 A simple and unoptimized implementation will be like this: 一个简单且未经优化的实现将是这样的:

private ArrayList<String> names = new ArrayList<>();

public void addAll(ArrayList<String> items) {
    names.clear();
    names.addAll(items);
    notifyDatasetChanged();
}

And you need to add items with addAll() method from main code when downloadingData finished its job(normally through an callback). 而且,当downloadingData完成其工作时(通常通过回调),您需要从主代码中使用addAll()方法添加项目。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM