【问题标题】:Error occur in recyclerViewrecyclerView 出现错误
【发布时间】:2018-08-11 00:51:48
【问题描述】:

此应用直接从 API 获取数据。当它运行时会发生这种类型的错误。基本上我认为错误发生在 getItemCount() 方法中,但我无法解决问题。我已附上错误文件和整个代码。如果您能解决错误,我将不胜感激。

java.lang.NullPointerException:尝试调用接口方法 空对象引用上的“int java.util.List.size()” 在 com.techbrightsoft.database.MyRecyler.getItemCount(MyRecyler.java:36) 在 android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3603) 在 android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3103) 在 android.view.View.measure(View.java:20151) 在 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.View.measure(View.java:20151) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) 在 android.support.v7.widget.ActionBarOverlayLayout.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.ViewGroup.measureChildWithMargins(ViewGroup.java:6330) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 在 com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3158) 在 android.view.View.measure(View.java:20151) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2594) 在 android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1549) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1841) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) 在 android.view.Choreographer.doCallbacks(Choreographer.java:695) 在 android.view.Choreographer.doFrame(Choreographer.java:631) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:158) 在 android.app.ActivityThread.main(ActivityThread.java:7224) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.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();
    }
}

【问题讨论】:

  • 你在哪里初始化authors_names,我认为你的arraylist没有数据
  • 我将主要活动中的 authors_names 初始化为数组列表
  • 是的,你已经声明了它,但是你在哪里将数据传递给数组列表
  • 您传递给回收站的数组列表为空
  • 我从 DownloadData 类传递数据

标签: android android-recyclerview recyclerview-layout


【解决方案1】:

似乎这段代码没有正确初始化authors_names。如果我猜对了你的代码逻辑,你想用downloadingData 的结果填充authors_names。通常,将该列表传递给您的适配器是一种不好的做法。

我的建议是用一个空列表初始化names,并定义一个addAll() 方法来更新其内容。一个简单且未优化的实现将是这样的:

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

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

downloadingData 完成工作(通常通过回调)时,您需要从主代码中使用addAll() 方法添加项目。

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 2020-10-28
    • 2016-05-10
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多