4

This question has been answered here

But my requirement is to reuse views, as I have to deal with large data so I can't initiate viewholder object every time I need to display view.

I'm using grid view with view holder pattern when I reuse convertView than onClickListener for first item don't respond and by touching anywhere in gridview it complete its action.

Following is my code for layout with GridView element.

    <GridView
        android:id="@+id/peopleList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"            
        android:numColumns="2"
        android:clickable="false"
        android:gravity="center"
        android:focusable="false"
        android:scrollbars="none"
        android:visibility="visible" 
        android:stretchMode="columnWidth"
        android:focusableInTouchMode="false"
        android:background="@color/transparent">
    </GridView>

Below is my layout for gridView items

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_gridview_data">

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/peopleImage"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/light_color"
    android:scaleType="fitXY"
    android:src="@drawable/image_placeholder" />

<TextView
    android:id="@+id/peopleNameText"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_gravity="center|top"
    android:background="@drawable/picture_gradient_small"
    android:gravity="left|center"
    android:paddingLeft="@dimen/horizontal_margin_10dp"
    android:text="abc123"
    android:textColor="@color/white"
    android:textSize="15sp" >
</TextView>

<ImageButton
    android:id="@+id/followUnfollow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right|bottom"
    android:layout_marginBottom="@dimen/horizontal_margin_10dp"
    android:layout_marginRight="@dimen/vertical_margin_5dp"
    android:background="@color/transparent"
    android:src="@drawable/follow" />

</FrameLayout>

Below is the code for my Adapter's getView()

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

    final Person mDiscoverPeople = mDiscoverPlacesList.get(position);

    if (convertView == null) {

        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.discover_people_grid_data_update, parent, false);

        mDiscoverPeopleListItemViewHolder = new DiscoverPeopleListItemViewHolder();
        mDiscoverPeopleListItemViewHolder.peopleImage = (NetworkImageView) convertView.findViewById(R.id.peopleImage);
        mDiscoverPeopleListItemViewHolder.peopleName = (TextView) convertView.findViewById(R.id.peopleNameText);
        mDiscoverPeopleListItemViewHolder.mFrameLayout = (FrameLayout) convertView.findViewById(R.id.fl);
        mDiscoverPeopleListItemViewHolder.follow = (ImageView) convertView.findViewById(R.id.followUnfollow);

        convertView.setTag(mDiscoverPeopleListItemViewHolder);
    } else {
        mDiscoverPeopleListItemViewHolder = (DiscoverPeopleListItemViewHolder) convertView.getTag();
    }

    mDiscoverPeopleListItemViewHolder.peopleImage.setImageUrl(mDiscoverPeople.getImgUrl(), imageLoader, false);
    mDiscoverPeopleListItemViewHolder.mFrameLayout.setLayoutParams(new GridView.LayoutParams(AppConstants.columnWidth - AppConstants.columnPadding, AppConstants.columnWidth - AppConstants.columnPadding));
    mDiscoverPeopleListItemViewHolder.peopleName.setText(mDiscoverPeople.getName());
    if (mDiscoverPeople.isFollowed())
        mDiscoverPeopleListItemViewHolder.follow.setImageResource(R.drawable.following);
    else
        mDiscoverPeopleListItemViewHolder.follow.setImageResource(R.drawable.follow);

    mDiscoverPeopleListItemViewHolder.follow.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            FollowUnfollowUser mFollowUnfollowUser = new FollowUnfollowUser(mContext, mDiscoverPeopleListItemViewHolder.follow, mDiscoverPeople);
            mFollowUnfollowUser.followUnFollowUser(AppConstants.DISCOVER_PEOPLE);
            Toast.makeText(mContext, "Follow/Unfollow", Toast.LENGTH_SHORT).show();
        }
    });

    mDiscoverPeopleListItemViewHolder.peopleImage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent mUserProfile = new Intent(mContext, FriendsRekkiesList.class);
            Bundle userData = new Bundle();
            userData.putSerializable(AppConstants.USER_DETAILS, mDiscoverPeople);
            mUserProfile.putExtras(userData);
            mContext.startActivity(mUserProfile);
        }
    });

    return convertView;
}

If I don't reuse my views it works fine except for application performance, I need a way to resolve this.

Any suggestions will be appreciated.... Thankx

Community
  • 1
  • 1
muak
  • 189
  • 2
  • 10

0 Answers0