androidgridviewpopupandroid-gridviewpopupwindow

PopUp Window not updating database - Android


I'm trying to create a kind of game using Android Studio. Till now I have done a gridview which shows players stored in a database. I have had some problems with gridView.setOnItemClickListener, I have had to do it by putting the code into gridView's Adparter.class so if you know how I can do that into gridView's activity please tell me.

My problem now is that when you click on a player a popup window appears in which you could change the player's name or his genre. When you click on Confirm's button the database will automatically been updated, but it doesn't works. I have try to do it step by step by using Toast in order to know if it run that part or not, the problem could be the context, but maybe I'm crazy.

I left you some pics and the code related to it.

Gridview's pic -> https://i.sstatic.net/GO4ms.png

PopUp windos's pic -> https://i.sstatic.net/aAvcm.png

gridView's adapter class

package es.fingerlabs.gamecohol;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class AdaptadorAmigos extends BaseAdapter {

  private Context context;
  private ArrayList<Amigo> misAmigos = new ArrayList<Amigo>();

  public AdaptadorAmigos(ArrayList<Amigo> list, Context context) {
     this.misAmigos = list;
     this.context = context;
  }

  public View getView(final int position, View convertView, ViewGroup parent) {

      View gridView = convertView;
      if (gridView == null) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        gridView = inflater.inflate(R.layout.item_amigo, null);
    }

    TextView TextoNombreJugador = (TextView)gridView.findViewById(R.id.tvNombreAmigo);
    TextoNombreJugador.setText(misAmigos.get(position).getNombre());

    //Handle buttons and add onClickListeners
    ImageButton deleteBtn = (ImageButton)gridView.findViewById(R.id.btEliminarAmigo);

    deleteBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //do something
            AmigosSQLiteHelper amigosdbh = new AmigosSQLiteHelper(context, "DBAmigos", null, 1);
            SQLiteDatabase db = amigosdbh.getWritableDatabase();
            db.delete("Amigos", "id_amigo="+misAmigos.get(position).getId(), null);
            misAmigos.remove(position); //or some other task
            //Eliminar de la base de datos **************
            notifyDataSetChanged();
        }
    });

    // ******* THIS IS WHAT I REFER TO PUT IT ON GRIDVIEW'S ACTIVITY *******

    gridView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast.makeText(context,"Id "+misAmigos.get(position).getId()+" Vidas "+misAmigos.get(position).getVidas(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, VistaAmigo.class);
            intent.putExtra("Id", (misAmigos.get(position).getId()));
            intent.putExtra("Nombre", (misAmigos.get(position)).getNombre());
            intent.putExtra("Genero", (misAmigos.get(position)).getGenero());
            context.startActivity(intent);
        }
    });

    return gridView;
}

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

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

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

gridView's class

package es.fingerlabs.gamecohol;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class SeleccionarAmigos extends AppCompatActivity {

   private ArrayList<Amigo> misAmigos;
   private GridView gridView;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_amigos);
      gridView = (GridView) findViewById(R.id.gvAmigos);
      refrescarLista();

    /* IF I PUT THAT HERE IT DOES NOTHING

       gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
            Toast.makeText(getApplicationContext(),misAmigos.get(position).getNombre(), Toast.LENGTH_SHORT).show();
        }
    });*/

    /*gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // get the data to pass to the activity based on the position clicked
            Intent intent = new Intent(SeleccionarAmigos.this, VistaAmigo.class);
            intent.putExtra("Id", (misAmigos.get(position).getId()));
            intent.putExtra("Nombre", (misAmigos.get(position)).getNombre());
            intent.putExtra("Genero", (misAmigos.get(position)).getGenero());
            startActivity(intent);
        }
    });*/

}

public void obtenerAmigos(){
    misAmigos = new ArrayList<Amigo>();
    AmigosSQLiteHelper amigosdbh = new AmigosSQLiteHelper(this, "DBAmigos", null, 1);
    SQLiteDatabase db = amigosdbh.getReadableDatabase();
    Cursor c = db.rawQuery(" SELECT Id_amigo,Nombre,Genero FROM Amigos ", null);
    //Nos aseguramos de que existe al menos un registro
    if (c.moveToFirst()) {
        //Recorremos el cursor hasta que no haya más registros
        do {
            int id = c.getInt(0);
            String nombre= c.getString(1);
            String genero= c.getString(2);
            Amigo nuevoAmigo = new Amigo(nombre,genero,null);
            nuevoAmigo.setId(id);
            this.misAmigos.add(nuevoAmigo);
        } while(c.moveToNext());
    }
    db.close();
}

public void refrescarLista(){
    obtenerAmigos();
    AdaptadorAmigos adapter = new AdaptadorAmigos(misAmigos, this);
    gridView.setAdapter(adapter);
}

}

PopUp window class

package es.fingerlabs.gamecohol;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.Toast;

public class VistaAmigo extends Activity {

private int id;
private String nombre;
private String genero;

private EditText etNombre;
private EditText etGenero;
private Button btConfirmar;

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

    etNombre = (EditText) findViewById(R.id.etNombreVistaAmigo);
    etGenero = (EditText) findViewById(R.id.etGeneroVistaAmigo);
    btConfirmar = (Button) findViewById(R.id.btConfirmarAmigo);

    Intent i = getIntent();
    i.getIntExtra("Id", id);
    nombre = i.getStringExtra("Nombre");
    genero = i.getStringExtra("Genero");

    etNombre.setHint(nombre);
    etGenero.setHint(genero);

    btConfirmar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AmigosSQLiteHelper amigosdbh = new AmigosSQLiteHelper(VistaAmigo.this, "DBAmigos", null, 1);
            SQLiteDatabase db = amigosdbh.getWritableDatabase();
            ContentValues valores = new ContentValues();
            valores.put("nombre", etNombre.getText().toString());
            valores.put("genero", etGenero.getText().toString());
            db.update("Amigos", valores, "id_amigo="+id, null);
            Toast.makeText(VistaAmigo.this.getBaseContext(),"Nombre: "+etNombre.getText().toString()+" Genero: "+etGenero.getText().toString()+
            "Cambios realizados",Toast.LENGTH_LONG);
        }
    });
}

}

gridView's layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fondogamecohol">

<GridView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/gvAmigos"
    android:layout_gravity="center_horizontal"
    android:numColumns="auto_fit"
    android:layout_margin="10dp"
    android:verticalSpacing="20dp"
    android:horizontalSpacing="20dp" />
</LinearLayout>

Gridview's item layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corners_white"
android:id="@+id/lyItemAmigo">

<ImageView
    android:layout_width="124dp"
    android:layout_height="95dp"
    android:id="@+id/ivFotoAmigo"
    android:background="#d8d8d8"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="12dp"
    android:layout_marginRight="12dp"
    android:clickable="false"
    android:src="@drawable/ic_tag_faces_white_36dp" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="Chrisitan"
    android:id="@+id/tvNombreAmigo"
    android:layout_gravity="center"
    android:textColor="#333333"
    android:textStyle="bold"
    android:textSize="18dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="12dp"
    android:clickable="false"
    android:layout_marginLeft="14dp" />

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="10dp"
    android:layout_marginLeft="10dp"
    android:gravity="right"
    android:id="@+id/lyBotonesAmigo"
    android:layout_marginTop="5dp"
    android:layout_marginRight="12dp">

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btEditarAmigo"
        android:clickable="false"
        android:background="@drawable/ic_edit_black_18dp" />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btEliminarAmigo"
        android:clickable="false"
        android:background="@drawable/ic_delete_forever_black_18dp" />
</LinearLayout>
</LinearLayout>

PopUp window layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/PopUp1">

<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/rounded_corners_white"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Modificar amigo"
        android:id="@+id/tvModificarAmigo"
        android:layout_gravity="center_horizontal"
        android:background="#c9ed5a"
        android:gravity="center_vertical|center_horizontal"
        android:textStyle="bold"
        android:textColor="#ffffff" />

    <RelativeLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nombre: "
            android:id="@+id/tvNombreVistaAmigo"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"
            android:layout_marginStart="28dp"
            android:layout_marginTop="51dp"
            android:textStyle="bold"
            android:textColor="#333333"
            android:textSize="20dp" />

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/etNombreVistaAmigo"
            android:layout_marginStart="10dp"
            android:hint="Jugador 1"
            android:textColorHint="#333333"
            android:textColor="#333333"
            android:textStyle="bold"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@+id/tvNombreVistaAmigo"
            android:layout_toRightOf="@+id/tvNombreVistaAmigo"
            android:layout_marginTop="41dp"
            android:textSize="20dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Genero:"
            android:id="@+id/tvGeneroVistaAmigo"
            android:layout_centerVertical="true"
            android:layout_alignStart="@+id/tvNombreVistaAmigo"
            android:textColor="#333333"
            android:textStyle="bold" />

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/etGeneroVistaAmigo"
            android:hint="Hombre"
            android:textColorHint="#333333"
            android:textColor="#333333"
            android:textStyle="bold"
            android:layout_alignStart="@+id/etNombreVistaAmigo"
            android:layout_below="@+id/etNombreVistaAmigo"
            android:layout_marginTop="23dp"
            android:textSize="20dp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Confirmar"
            android:id="@+id/btConfirmarAmigo"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:background="@drawable/rounded_corners_green"
            android:layout_marginBottom="20dp"
            android:textStyle="bold"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:textSize="20dp" />

    </RelativeLayout>

</LinearLayout>
</RelativeLayout>

Solution

  • From what I´ve seen in your code is, that you try to get the id from an intent in your PopUp window class. You have made one thing wrong:

    Intent i = getIntent();
    i.getIntExtra("Id", id);
    

    it must be:

    Intent i = getIntent();
    id = i.getIntExtra("Id", id); //forgott id = here
    

    and you should give a default value to id for example id=-1 . The problem is, by updating your database, you give a non value integer and so it is not possible to update your table.