Android: попытка вызвать виртуальный метод для пустой ссылки на объект в onBindViewHolder - PullRequest
0 голосов
/ 07 мая 2019

Мое приложение должно анализировать данные JSON и отображать их в виде переработчика. Когда я запускаю приложение, оно вылетает со следующей ошибкой: enter image description here

Я повторно проверял свой код несколько раз, чтобы убедиться, что я вызываю правильные файлы ресурсов, но я все еще не могу найти источник проблемы. Logcat говорит мне, что проблема в методе onBindViewHolder в классе адаптера представления рециркулятора, но для меня все выглядит нормально. Может кто-то указать мне верное направление? Вот соответствующий код:

Адаптер Recycler View:

    public class IndRvAdapter extends RecyclerView.Adapter<IndRvAdapter.MyViewHolder> {

    private Context context;
    private List<Ind> indList;

    public IndRvAdapter(Context context, List<Ind> indList) {
        this.context = context;
        this.indList = indList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view;
        LayoutInflater inflater = LayoutInflater.from(context);
        view = inflater.inflate(R.layout.ind_card, viewGroup, false);
        final MyViewHolder viewHolder = new MyViewHolder(view);
        viewHolder.indView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(context, SingleInd.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("pacshort", indList.get(viewHolder.getAdapterPosition()).getPacshort());
                i.putExtra("supopp", indList.get(viewHolder.getAdapterPosition()).getSuppopp());
                i.putExtra("candname", indList.get(viewHolder.getAdapterPosition()).getCandname());
                i.putExtra("district", indList.get(viewHolder.getAdapterPosition()).getDistrict());
                i.putExtra("amount", indList.get(viewHolder.getAdapterPosition()).getAmount());
                i.putExtra("party", indList.get(viewHolder.getAdapterPosition()).getExpParty());
                i.putExtra("payee", indList.get(viewHolder.getAdapterPosition()).getPayee());
                i.putExtra("date", indList.get(viewHolder.getAdapterPosition()).getDate());
                i.putExtra("origin", indList.get(viewHolder.getAdapterPosition()).getOrigin());
                i.putExtra("source", indList.get(viewHolder.getAdapterPosition()).getSource());
                context.startActivity(i);
            }
        });
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
        myViewHolder.pacshorts.setText(indList.get(i).getPacshort());
        myViewHolder.supOpp.setText(indList.get(i).getSuppopp());
        myViewHolder.candName.setText(indList.get(i).getCandname());
        myViewHolder.district.setText(indList.get(i).getDistrict());
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView pacshorts, supOpp, candName, district;
        LinearLayout indView;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            pacshorts = itemView.findViewById(R.id.tv_pacshort);
            supOpp = itemView.findViewById(R.id.tv_suppopp);
            candName = itemView.findViewById(R.id.tv_candname);
            district = itemView.findViewById(R.id.tv_district);
            indView = itemView.findViewById(R.id.ind_view);
        }
    }
}

Карта Просмотр ресурса:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:id="@+id/ind_view">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:elevation="3dp"
        card_view:cardCornerRadius="15dp"
        card_view:cardElevation="4dp"
        card_view:cardUseCompatPadding="true">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorPrimaryDark">

            <TextView
                android:id="@+id/pacshort"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="TextView" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/pacshort"
                android:id="@+id/tv_suppop"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/tv_candname"
                android:layout_below="@+id/tv_suppop"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/tv_district"
                android:layout_below="@+id/tv_candname"/>
        </RelativeLayout>
    </android.support.v7.widget.CardView>


</LinearLayout>

Recycler View:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background_color"
    tools:context=".IndExpend">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ind_rv">
    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

Основная операция, которая анализирует данные JSON

    public class IndExpend extends AppCompatActivity {
    /*
    * Open secrets API: Returns the 50 latest independent expenditures transactions
    * Updated every 4 days
    */

    private static final String url = "http://www.opensecrets.org/api/?method=independentExpend&output=json&apikey=d1ff8f708ca0745d75e9ffa0ee6f3d09";
    private LinearLayoutManager linearLayoutManager;
    private List <Ind> indList;
    private RecyclerView myrv;
    private RecyclerView.Adapter adapter;

    public IndExpend(){}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ind_expend);

        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        myrv = findViewById(R.id.ind_rv);
        indList = new ArrayList<>();
        adapter = new IndRvAdapter(this, indList);

        myrv.setHasFixedSize(true);
        myrv.setLayoutManager(linearLayoutManager);
        myrv.setAdapter(adapter);

        getData();
    }

    private void getData() {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                progressDialog.dismiss();
                try {
                    JSONObject object = new JSONObject (response);
                    JSONObject responseObj = object.getJSONObject("response");
                    JSONArray array = responseObj.getJSONArray("indexp");
                    for (int i = 0; i < array.length(); i++){
                        JSONObject attributesObj = array.getJSONObject(i).getJSONObject("@attributes");
                        Ind ind = new Ind(attributesObj.getString("pacshort"),
                                attributesObj.getString("suppopp"),
                                attributesObj.getString("candname"),
                                attributesObj.getString("district"),
                                attributesObj.getString("amount"),
                                attributesObj.getString("party"),
                                attributesObj.getString("payee"),
                                attributesObj.getString("date"),
                                attributesObj.getString("origin"),
                                attributesObj.getString("source"));
                        indList.add(ind);
                    }
                    adapter = new IndRvAdapter(getApplicationContext(), indList);
                    myrv.setAdapter(adapter);
                }catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
                progressDialog.dismiss();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this );
        requestQueue.add(stringRequest);
    }
}

Может ли кто-нибудь помочь мне найти источник проблемы?

1 Ответ

0 голосов
/ 07 мая 2019

Я думаю, это потому, что вы пытаетесь связать представление с этим идентификатором:

pacshorts = itemView.findViewById(R.id.tv_pacshort);

Но в файле макета идентификатор этого элемента просто pacshort:

<TextView
            android:id="@+id/pacshort"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="TextView" />

Как правило, для этих типов исключений нулевого указателя при работе на Android происходит по одной из двух причин. Во-первых, файл res, который раздувается, не является правильным, или, во-вторых, идентификатор, используемый для привязки представлений, написан с ошибкой или не существует в этом представлении.

...