Ошибка в recyclerView

Это приложение получает данные напрямую из API. Когда он запускается, возникает ошибка такого типа. В основном я думаю, что ошибка возникает в методе getItemCount (), но я не могу решить проблему. Я прикрепил файл с ошибкой и весь код. Буду признателен, если вы исправите ошибку.

Кажется, этот код неправильно инициализирует

  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();
    }
}
. Если я правильно угадаю логику вашего кода, вы хотите заполнить _2_ результатом из _3_. Как правило, передача этого списка адаптеру - плохая практика.

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

person Smart Programmer    schedule 02.03.2018    source источник
comment
Я инициализирую author_names в основном действии как arraylist   -  person Navneet Krishna    schedule 02.03.2018
comment
да, вы заявили об этом, но куда вы передаете данные в массив?   -  person Smart Programmer    schedule 02.03.2018
comment
Список массивов, который вы передаете своему переработчику, равен нулю.   -  person Navneet Krishna    schedule 02.03.2018
comment
Я передаю данные из класса DownloadData   -  person Kushan    schedule 02.03.2018
comment
@Override protected void onPostExecute (String s) {super.onPostExecute (s); попробуйте {JSONObject object = new JSONObject (s); Строковые имена = object.getString (статьи); Массив JSONArray = новый массив JSONArray (имена); for (int i = 0; i ‹array.length (); i ++) {JSONObject list_of_names = array.getJSONObject (i); Строка l = list_of_names.getString (автор); MainActivity.authors_names.add (l); }} catch (JSONException e) {e.printStackTrace ();}}}   -  person Smart Programmer    schedule 02.03.2018
comment
То или его содержимое равно нулю ...   -  person Smart Programmer    schedule 02.03.2018
comment
когда вы впервые подключаете адаптер, массив все еще _1_, потому что результат еще не готов, и это вызывает исключение. Смотрите мой ответ.   -  person Kushan    schedule 02.03.2018
comment
Установите RecyclerView в функции обратного вызова. Вызов API может быть выполнен не вовремя.   -  person Afshin    schedule 02.03.2018
comment
@SmartProgrammer добавьте свой ответ json, возможно, вы неправильно его разбираете   -  person Johan    schedule 02.03.2018
comment
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.su pport.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.ViewGrou p.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.performversals ( 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.handleCallCall (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)   -  person Navneet Krishna    schedule 02.03.2018


Ответы (1)


Мое предложение - инициализировать names пустым списком и определить метод addAll() для обновления его содержимого. Простая и неоптимизированная реализация будет такой:

И вам нужно добавить элементы с помощью метода addAll() из основного кода, когда downloadingData завершит свою работу (обычно через обратный вызов).

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

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

где вы инициализируете authors_names, у вашего Arraylist нет данных, я думаю

person Afshin    schedule 02.03.2018