Tuss
Tuss

Reputation: 57

Open Dialog Box on GridView click

I have a GridView which is populated from items in my SQLite database. The problem is, I cannot figure out how to show a Dialog box when a certain item on the GridView is clicked. I am using a custom adapter, my code is below (I am fairly new to android, any helps/tips will be appreciated):

RolesFragment.java

public class RolesFragment extends Fragment implements View.OnClickListener {

    GridView gridView;
    ArrayList<Players> playersList;
    MyAdapter adapter;

    public RolesFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_viewroles, container, false);

        gridView = (GridView) view.findViewById(R.id.gv_players);



        DatabaseHelper databaseHelper = new DatabaseHelper(getActivity());
        playersList = new ArrayList<Players>();

        playersList = databaseHelper.getPlayers();
        adapter = new MyAdapter(getActivity(), playersList);
        gridView.setAdapter(adapter);
        addListenerToGrid();


        return view;

    }

    public void addListenerToGrid() {
        gridView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent me) {

                int action = me.getActionMasked();
                String TAG = "Pressed";
                float currentXPosition = me.getX();
                float currentYPosition = me.getY();
                int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
                    if (action == MotionEvent.ACTION_UP) {
                        Log.d(TAG, "-");
                    }
                return true;
            }
        });
    }


    @Override
    public void onClick(View v) {

    }
}

MyAdapter.java

public class MyAdapter extends BaseAdapter {
Context context;
ArrayList<Players> playerList;
private static LayoutInflater inflater = null;

public MyAdapter(Context context, ArrayList<Players> playerList){
    this.context = context;
    this.playerList = playerList;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
        convertView = inflater.inflate(R.layout.layout_grid_item, null);

    TextView idTextView = (TextView) convertView.findViewById(R.id.tv_player_id);
    TextView nameTextView = (TextView) convertView.findViewById(R.id.tv_player_name);
    TextView roleTextView = (TextView) convertView.findViewById(R.id.tv_player_role);

    Players p = new Players();
    p = playerList.get(position);
    idTextView.setText("ID: " + String.valueOf(p.getId()));
    nameTextView.setText("Name: " + String.valueOf(p.getName()));
    roleTextView.setText("Role: " + String.valueOf(p.getRole()));

    return convertView;
}


}

DatabaseHelper.java - related code -

public ArrayList<Players> getPlayers(){
    String query = "SELECT * FROM " + TABLE_NAME;
    ArrayList<Players> players = new ArrayList<Players>();
    SQLiteDatabase database = getReadableDatabase();
    Cursor c = database.rawQuery(query, null);
    if (c != null){
        while (c.moveToNext()) {
            int id = c.getInt(c.getColumnIndex(COL_ID));
            String name = c.getString(c.getColumnIndex(COL_NAME));
            String role = c.getString(c.getColumnIndex(COL_ROLE));

            Players player = new Players();
            player.setId(id);
            player.setName(name);
            player.setRole(role);

            Log.v("DBHelper:", "Name:, " + name);
            Log.v("DBHelper:", "ID:" + id);
            Log.v("DBHelper:", "Role:" + role);

            players.add(player);
        }
    }

    return players;

}

The idea is, when a person clicks on the GridView which displays their ID and Name... it shows the related "Role" for the player.

Upvotes: 0

Views: 270

Answers (1)

Jonathan Aste
Jonathan Aste

Reputation: 1774

Add this to your fragment:

public class RolesFragment extends Fragment implements OnClickCallback {

    MyAdapter adapter;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

        ...
        adapter = new MyAdapter(getActivity(), playersList,this);
        ...
        return view;
    }    

    @Override
        public void onItemClick(int position){
            //create a dialog here based on the item selected
            //to get the item selected you can do adapter.getItem(position);
        }
    }

The interface itself:

public interface OnClickCallback {
    void onItemClick(int position);
}

then on the adapter:

public class MyAdapter extends BaseAdapter {
    Context context;
    OnClickCallback callback;
    ...

    public MyAdapter(Context context, ArrayList<Players> playerList,OnClickCallback callback){
        this.context = context;
        this.callback = callback;
        this.playerList = playerList;
        inflater = (LayoutInflater) c 
        Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            convertView = inflater.inflate(R.layout.layout_grid_item, null);   

        ...
        convertView.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View view) {
                callback.OnItemClick(getAdapterPosition());
            }
        }; 
        return convertView;
    }
}

Upvotes: 0

Related Questions