Search code examples
javaandroidandroid-listviewandroid-adapter

ListView Custom Adapter error on scrolling


I have attached my code below of custom adapter of listView but when I am scrolling the list I got:

mView does not exist, so discard the remaining points. java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference Can anybody help why I am getting this error it would be very helpfull

public class TransactionAdapter extends BaseAdapter {
    private static final String TAG = TransactionAdapter.class.getName();
    List<Transacation> arrlist;
    Context c;
    private LayoutInflater inflater;

    public TransactionAdapter(Context context, List<Transacation> list) {
        this.arrlist = list;
        this.c = context;
        inflater = LayoutInflater.from(this.c);
    }

        @Override
        public int getCount() {
            return arrlist.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View result;
            final MyViewHolder myViewHolder;
            myViewHolder = new MyViewHolder();
            final Transacation transacation = arrlist.get(position);
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.transaction_adapter, parent,
                        false);

                myViewHolder.tv_date = convertView.findViewById(R.id.tv_date);
                myViewHolder.tv_status = convertView.findViewById(R.id.tv_status);
                myViewHolder.tv_expiry = convertView.findViewById(R.id.tv_expiry);
                myViewHolder.tv_amount = convertView.findViewById(R.id.tv_amount);

                result = convertView;
                convertView.setTag(myViewHolder);

            } else {
                result = convertView;
            }

            //        myViewHolder.tv_date.setText(""+new java.text.SimpleDateFormat("dd MMM").format(new java.util.Date (transacation.date)));
            if(transacation.transactionType.equals("CREDIT")){
                myViewHolder.tv_status.setText("Wallet Credited");
                myViewHolder.tv_expiry.setText("Expires on " + new java.text.SimpleDateFormat("dd MMM yyyy").format(new java.util.Date (transacation.expiry_date)));
                myViewHolder.tv_amount.setText("+₹" + transacation.n_amount);
                myViewHolder.tv_amount.setTextColor(Color.parseColor("#23DD47"));

            }
            else{
                myViewHolder.tv_status.setText("Wallet Expired");
                myViewHolder.tv_expiry.setVisibility(View.GONE);
                myViewHolder.tv_amount.setText("-₹" + transacation.n_amount);
                myViewHolder.tv_amount.setTextColor(Color.parseColor("#FB5151"));

            }

            return convertView;
        }

        private class MyViewHolder {
            TextView tv_date;
            TextView tv_status;
            TextView tv_expiry;
            TextView tv_amount;
        }
    }


Solution

  • You need to construct the ViewHolder when the convertView is not null by getting the tag back, so change your getView() to be:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View result;
        final MyViewHolder myViewHolder;
        final Transacation transacation = arrlist.get(position);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.transaction_adapter, parent,
                    false);
            myViewHolder = new MyViewHolder()
            myViewHolder.tv_date = convertView.findViewById(R.id.tv_date);
            myViewHolder.tv_status = convertView.findViewById(R.id.tv_status);
            myViewHolder.tv_expiry = convertView.findViewById(R.id.tv_expiry);
            myViewHolder.tv_amount = convertView.findViewById(R.id.tv_amount);
    
            result = convertView;
            convertView.setTag(myViewHolder);
    
        } else {
            result = convertView;
            myViewHolder = (MyViewHolder) convertView.getTag();
        }
    
        //        myViewHolder.tv_date.setText(""+new java.text.SimpleDateFormat("dd MMM").format(new java.util.Date (transacation.date)));
        if(transacation.transactionType.equals("CREDIT")){
            myViewHolder.tv_status.setText("Wallet Credited");
            myViewHolder.tv_expiry.setText("Expires on " + new java.text.SimpleDateFormat("dd MMM yyyy").format(new java.util.Date (transacation.expiry_date)));
            myViewHolder.tv_amount.setText("+₹" + transacation.n_amount);
            myViewHolder.tv_amount.setTextColor(Color.parseColor("#23DD47"));
    
        }
        else{
            myViewHolder.tv_status.setText("Wallet Expired");
            myViewHolder.tv_expiry.setVisibility(View.GONE);
            myViewHolder.tv_amount.setText("-₹" + transacation.n_amount);
            myViewHolder.tv_amount.setTextColor(Color.parseColor("#FB5151"));
    
        }
    
        return convertView;
    }