Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Android

GridView check image are not added when grid is tapped

I have a gridView that I set to display an overlay image when it is tapped but for some reason this doesn't happen. When i reload the activity, the checked grid actually displays the overlay but tapping it doesn't remove the overlay.

Here is the code for the GridView activity

public class SearchActivity extends Activity {

private ParseQueryAdapter<ParseUser> mainAdapter;

protected ParseRelation<ParseUser> mFriendsRelation;
protected ParseUser mCurrentUser;
protected GridView mGridView;

@InjectView(R.id.search_editText) EditText mSearchText;
@InjectView(R.id.search_button) ImageButton mSearchButton;

protected List<ParseUser> mUsers;

protected final String mUsername = null;

public static final String TAG = SearchActivity.class.getSimpleName();

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

    mGridView = (GridView)findViewById(R.id.friendsGrid);

    mGridView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    mGridView.setOnItemClickListener(mOnItemClickListener);
}

@Override
protected void onResume(){
    super.onResume();
    ButterKnife.inject(this);

    mCurrentUser = ParseUser.getCurrentUser();
    mFriendsRelation = mCurrentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION);

    mSearchButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            QueryUser();
        }
    });
}

private void QueryUser() {
    EditText gUname;
    gUname = (EditText)findViewById(R.id.search_editText);
    setProgressBarIndeterminateVisibility(true);

    String gUsername = gUname.getText().toString();

    Log.d("singleTune", "Check for "+gUsername);
    ParseQuery<ParseUser> query = ParseUser.getQuery();
    query.whereContains("username", gUsername);
    query.orderByAscending(ParseConstants.KEY_USERNAME);
    query.setLimit(1000);
    query.findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> users, ParseException e) {
            setProgressBarIndeterminateVisibility(false);
            if(e != null){
                Log.d("singleTune", "Nothing found");
            }else{
                mUsers = users;
                String[] usernames = new String[mUsers.size()];
                int i = 0;
                for(ParseUser user : mUsers){
                    usernames[i] = user.getUsername();
                    i++;
                }
                if(mGridView.getAdapter() == null){
                    UserListAdapter adapter = new UserListAdapter(SearchActivity.this, mUsers);
                    mGridView.setAdapter(adapter);
                }
                else {
                    ((UserListAdapter)mGridView.getAdapter()).refill(mUsers);
                }

                friendFollowCheck();
            }

        }
    });
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.search_results, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private void friendFollowCheck(){
    mFriendsRelation.getQuery().findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> friends, ParseException e) {
            if(e == null){
                for (int i = 0; i < mUsers.size(); i++){
                    ParseUser user = mUsers.get(i);
                    for (ParseUser friend : friends){
                        if (friend.getObjectId().equals(user.getObjectId())){
                            //TODO: Change button style and text
                            mGridView.setItemChecked(i, true);
                        }
                    }
                }
            }
            else {
                Log.e(TAG, e.getMessage());
            }
        }
    });
}

protected AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
    Boolean followed;
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    if (mGridView.isItemChecked(i)) {
        mFriendsRelation.add(mUsers.get(i));
        followed = true;
        sendPushNotification(mUsers.get(i).getObjectId(), followed);
        Log.d(TAG, "Checked");
    }
    else {
        // remove the friend
        mFriendsRelation.remove(mUsers.get(i));
        followed = false;
        sendPushNotification(mUsers.get(i).getObjectId(), followed);
    }
    mCurrentUser.saveInBackground(new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e != null) {
                Log.e(TAG, e.getMessage());
            }
        }
    });
    }
};

private void sendPushNotification(String userId, Boolean b){
    ParseQuery<ParseInstallation> query = ParseInstallation.getQuery();
    query.whereEqualTo(ParseConstants.KEY_USER_ID, userId);

    ParsePush push = new ParsePush();
    push.setQuery(query);
    if (b){
        push.setMessage("Yay! "+ ParseUser.getCurrentUser().getUsername()+ " is now following you.");
    }
    else{
        push.setMessage("Aww! "+ ParseUser.getCurrentUser().getUsername()+ " has unfollowed you.");
    }
    push.sendInBackground();
}

Here is the adapter

public class UserListAdapter extends ArrayAdapter<ParseUser> {

private static final String TAG = "Test";
protected Context mContext;
protected List<ParseUser> mParseUsers;
protected ParseRelation<ParseUser> mFriendsRelation;
protected ParseUser mCurrentUser;
protected Boolean followed;
protected Boolean followStatus;

protected List<ParseUser> mUsers;

public UserListAdapter(Context context, List<ParseUser> users){
    super(context, R.layout.user_item, users);
    mContext = context;
    mParseUsers = users;
}

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

    ViewHolder holder;

    if (convertView == null){
        LayoutInflater inflater = (LayoutInflater.from(mContext));
        convertView = inflater.inflate(R.layout.user_item, parent, false);
        holder = new ViewHolder();
        holder.avatar = (ImageView) convertView.findViewById(R.id.avatarImageView);
        holder.selectedAvatar = (ImageView) convertView.findViewById(R.id.selectedAvatarImageView);
        holder.usernameLabel = (TextView) convertView.findViewById(R.id.usernameLabel);
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder)convertView.getTag();
    }

    ParseUser user = mParseUsers.get(position);

    String email = user.getEmail().toLowerCase();

    if(email.equals("")){
        holder.avatar.setImageResource(R.drawable.default_avatar);
    }
    else{
        String hash = MD5Util.md5Hex(email);
        String gravatarUrl = "http://www.gravatar.com/avatar/"+ hash + "?s=272&d=404";
        Picasso.with(mContext).load(gravatarUrl).placeholder(R.drawable.default_avatar).into(holder.avatar);
    }
    holder.usernameLabel.setText(user.getUsername());

    GridView gridView = (GridView)parent;
    if(gridView.isItemChecked(position)){
        holder.selectedAvatar.setVisibility(View.VISIBLE);
    }
    else {

        holder.selectedAvatar.setVisibility(View.INVISIBLE);
    }

    return convertView;
}



//
private static class ViewHolder{
    ImageView avatar;
    ImageView selectedAvatar;
    TextView usernameLabel;
}

public void refill(List<ParseUser> users){
    mParseUsers.clear();
    mParseUsers.addAll(users);
    notifyDataSetChanged();
}

What might I be missing?

Thanks

1 Answer

Calvin Nix
Calvin Nix
43,828 Points

Hi Thompson,

This can be accomplished by toggling the visibility of the images whenever onItemClickListener is triggered.

This video will show you step-by-step on how to accomplish this task.