简体   繁体   中英

How to refresh a TextView from another class?

I get this error:

Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

public class AdaptadorCarrito extends
    RecyclerView.Adapter<AdaptadorCarrito.ViewHolderCarrito> {

ArrayList<CarritoVo> listaCarrito;
AdaptadorCarrito adapter;
RecyclerView.Adapter madapter;
int i = 1;

public AdaptadorCarrito(ArrayList<CarritoVo> listaCarrito) {
    this.listaCarrito = listaCarrito;
}

@NonNull
@Override
public ViewHolderCarrito onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_carrito, null, false);
    final ViewHolderCarrito myHolder = new ViewHolderCarrito(view);
    final CafeteriaDB cafeteriaDB = new CafeteriaDB(parent.getContext());

    myHolder.item_list_carrito.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int newPosition = myHolder.getAdapterPosition();
            cafeteriaDB.eliminarProducto(myHolder.etiNombre.getText().toString(), myHolder.etiInfo.getText().toString());
            eliminarProducto(newPosition);
            // i++;
            // Toast.makeText(parent.getContext(),"Producto Eliminado "+i+" eliminado",Toast.LENGTH_SHORT).show();
            CarritoCompras obj = new CarritoCompras();
            TextView tv = obj.getTextView(); //Error Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
            tv.setText(String.valueOf(cafeteriaDB.getTotal()));
        }

    });
    return myHolder;
}

private void eliminarProducto(int position) {
    listaCarrito.remove(position);
    notifyItemRemoved(position);
}

@Override
public void onBindViewHolder(@NonNull ViewHolderCarrito holder, int position) {
    CarritoVo positions = listaCarrito.get(position);
    holder.etiNombre.setText(listaCarrito.get(position).getNombre());
    holder.etiPrecio.setText(String.valueOf(listaCarrito.get(position).getPrecio()));
    holder.etiInfo.setText(listaCarrito.get(position).getInfo());
    holder.etiCantidades.setText(String.valueOf(listaCarrito.get(position).getCantidad()));
    holder.etiFoto.setImageBitmap(positions.getFoto());
}

@Override
public int getItemCount() {
    //return listaCarrito.size();
    return (listaCarrito == null) ? 0 : listaCarrito.size();
}

public class ViewHolderCarrito extends RecyclerView.ViewHolder {

    LinearLayout item_list_carrito;
    TextView etiNombre, etiPrecio, etiInfo, etiCantidades, txtTotalB, txtTotalF;
    ImageView etiFoto;

    public ViewHolderCarrito(@NonNull View itemView) {
        super(itemView);
        item_list_carrito = (LinearLayout) itemView.findViewById(R.id.id_carrito_item);
        etiFoto = (ImageView) itemView.findViewById(R.id.fotoC);
        etiNombre = (TextView) itemView.findViewById(R.id.nombreC);
        etiPrecio = (TextView) itemView.findViewById(R.id.precioC);
        etiInfo = (TextView) itemView.findViewById(R.id.infoC);
        etiCantidades = (TextView) itemView.findViewById(R.id.cantidadC);
    }
}
}

Activity

public class CarritoCompras extends AppCompatActivity implements Carrito.OnFragmentInteractionListener{

TextView txtTotalF;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_carrito_compras);
    CafeteriaDB db = new CafeteriaDB(this);

    getTextView();

    txtTotalF = (TextView)findViewById(R.id.totalF);

    txtTotalF.setText(String.valueOf(db.totalFilas()));

}

public TextView getTextView(){
    TextView txtTotalB = (TextView)findViewById(R.id.totalB); //Error Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
    return txtTotalB;
}



@Override
public void onFragmentInteraction(Uri uri) {

}
}

You can do like the following way

Step 1:

Load TextView at only once

  TextView txtTotalB; // declare class level

inside onCreate()

 txtTotalB = (TextView)findViewById(R.id.totalB);

Step 2:

create method

public TextView getTextView(){
    return txtTotalB
}

Step 3:

inside your adapter class access your activity method like below

TextView tv = ((CarritoCompras)context).getTextView();
tv.setText(String.valueOf(cafeteriaDB.getTotal()));   // now here you done

You can use Interfaces for communication.

Create an interface as shown below:

public interface RecyclerItemClickListener {
    void onItemClick(String text);
}

In your adapter class, create declare a variable of type RecyclerItemClickListener and modify the Adapter's constructor to accept an instance of 'RecyclerItemClickListener' as a parameter. ie Modify your Adapter class as shown below:

public class AdaptadorCarrito extends
    RecyclerView.Adapter<AdaptadorCarrito.ViewHolderCarrito> {

RecyclerItemClickListener recyclerItemClickListener; //Here we are declaring a variable of the created interface
ArrayList<CarritoVo> listaCarrito;
AdaptadorCarrito adapter;
RecyclerView.Adapter madapter;
int i = 1;

//Modifying the constructor to initialize the above declared listener
public AdaptadorCarrito(ArrayList<CarritoVo> listaCarrito, RecyclerItemClickListener listener) {
    this.listaCarrito = listaCarrito;
    this.recyclerItemClickListener = listener;
}

@NonNull
@Override
public ViewHolderCarrito onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_carrito, null, false);
    final ViewHolderCarrito myHolder = new ViewHolderCarrito(view);
    final CafeteriaDB cafeteriaDB = new CafeteriaDB(parent.getContext());

    myHolder.item_list_carrito.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int newPosition = myHolder.getAdapterPosition();
            cafeteriaDB.eliminarProducto(myHolder.etiNombre.getText().toString(), myHolder.etiInfo.getText().toString());
            eliminarProducto(newPosition);
            // i++;
            // Toast.makeText(parent.getContext(),"Producto Eliminado "+i+" eliminado",Toast.LENGTH_SHORT).show();
            CarritoCompras obj = new CarritoCompras();
            /*TextView tv = obj.getTextView(); //Error Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
            tv.setText(String.valueOf(cafeteriaDB.getTotal()));*/

       //Here we are passing the test to be displayed in the textview to your activity     
       recyclerItemClickListener.onItemClick(String.valueOf(cafeteriaDB.getTotal()));
        }

    });
    return myHolder;
}

private void eliminarProducto(int position) {
    listaCarrito.remove(position);
    notifyItemRemoved(position);
}

@Override
public void onBindViewHolder(@NonNull ViewHolderCarrito holder, int position) {
    CarritoVo positions = listaCarrito.get(position);
    holder.etiNombre.setText(listaCarrito.get(position).getNombre());
    holder.etiPrecio.setText(String.valueOf(listaCarrito.get(position).getPrecio()));
    holder.etiInfo.setText(listaCarrito.get(position).getInfo());
    holder.etiCantidades.setText(String.valueOf(listaCarrito.get(position).getCantidad()));
    holder.etiFoto.setImageBitmap(positions.getFoto());
}

@Override
public int getItemCount() {
    //return listaCarrito.size();
    return (listaCarrito == null) ? 0 : listaCarrito.size();
}

public class ViewHolderCarrito extends RecyclerView.ViewHolder {

    LinearLayout item_list_carrito;
    TextView etiNombre, etiPrecio, etiInfo, etiCantidades, txtTotalB, txtTotalF;
    ImageView etiFoto;

    public ViewHolderCarrito(@NonNull View itemView) {
        super(itemView);
        item_list_carrito = (LinearLayout) itemView.findViewById(R.id.id_carrito_item);
        etiFoto = (ImageView) itemView.findViewById(R.id.fotoC);
        etiNombre = (TextView) itemView.findViewById(R.id.nombreC);
        etiPrecio = (TextView) itemView.findViewById(R.id.precioC);
        etiInfo = (TextView) itemView.findViewById(R.id.infoC);
        etiCantidades = (TextView) itemView.findViewById(R.id.cantidadC);
    }
}
}

Now in your Activity where you will be instantiating the AdaptadorCarrito Object, you need to pass the instance of RecyclerItemClickListener as parameter to the Adapter's constructor.

Example:

AdaptadorCarrito adapter = new AdaptadorCarrito(listaCarrito , new RecyclerItemClickListener() {
            @Override
            public void onItemClick(String text) {
                 //In here you can set your TextView's text
                 TextView txtTotalB = (TextView)findViewById(R.id.totalB);
                 txtTotalB.setText(text);
            }
        });

Thanks for answering, I was able to solve my problem, which was to update a text view that was in an activity but that needed the help of an event that was in another class to do so.

first adding an activity in the constructor of the adapter

  Activity activity;

public AdaptadorCarrito(ArrayList<CarritoVo> nlistaCarrito, Activity nactivity) {
    nListCarrito = nlistaCarrito;
    this.activity = nactivity;
}

Then calling TextView the this way:

 public ViewHolderCarrito onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_carrito,null,false);
    final ViewHolderCarrito myHolder = new ViewHolderCarrito(view);
    final CafeteriaDB cafeteriaDB = new CafeteriaDB(parent.getContext());;
    final CarritoCompras carrito = new CarritoCompras();
   ---->final TextView txtTotalB = (TextView)this.activity.findViewById(R.id.totalB);
    txtTotalB.setText(String.valueOf(cafeteriaDB.getTotal()));

    myHolder.item_list_carrito.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int newPosition = myHolder.getAdapterPosition();
            cafeteriaDB.eliminarProducto(myHolder.etiNombre.getText().toString(), myHolder.etiInfo.getText().toString());
            eliminarProducto(newPosition);
           Toast.makeText(parent.getContext(),"Producto Eliminado",Toast.LENGTH_SHORT).show();
      ----->  txtTotalB.setText(String.valueOf(cafeteriaDB.getTotal()));
        }

    });
    return myHolder;
}

and finally creating an instance of the adapter in the activity

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_carrito_compras);
    ArrayList<CarritoVo> nLlistaCarrito = null;

    ------>AdaptadorCarrito adapter = new AdaptadorCarrito(nLlistaCarrito,this);

    CafeteriaDB cafeteriaDB = new CafeteriaDB(this);

    TextView txtTotalB = (TextView)findViewById(R.id.totalB);
    txtTotalB.setText(String.valueOf(cafeteriaDB.totalFilas()));

    TextView txtTotalF = (TextView)findViewById(R.id.totalF);
    txtTotalF.setText(String.valueOf(cafeteriaDB.totalFilas()));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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