Search code examples
androidandroid-gridview

Android GridView(customized) fragement picture ,but cant open the page


I want to make a customized GridView in Fragement, using URLHTTP to get the url and use the Bitmap.

But I'm only half way though,

I can't open the MapFragement page & i can't find my bug .I can't solve the problem for long time, please help me.

Please help or try to give some ideas how to achieve this,

thanks!

My Code:

item_gridview_member.xml

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

        <ImageView
            android:id="@+id/imgmember"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </RelativeLayout>

fragement_member.xml

       <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout
            android:orientation="vertical"  xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MemberFragment">
          <GridView
              android:id="@+id/gridmember"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:columnWidth="150dp"
              android:stretchMode="columnWidth"
              android:numColumns="3"
              android:verticalSpacing="3dp"
              android:layout_marginBottom="3dp">
          </GridView>

CImage.java

    import android.graphics.Bitmap;

    public class CImage {

            private String imagePath;
            private Bitmap bitmap;

        public CImage(String imagePath, Bitmap bitmap) {
            this.imagePath = imagePath;
            this.bitmap = bitmap;
        }

        public String getImagePath() {
                return imagePath;
            }
            public void setImagePath(String imagePath) {
                this.imagePath = imagePath;
            }
            public Bitmap getBitmap() {
                return bitmap;
            }
            public void setBitmap(Bitmap bitmap) {
                this.bitmap = bitmap;
            }

    }

GridViewAdapter.java

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;  
    import com.example.yao.pm.R;  
    import java.util.List;   
    public class GridViewAdapter  extends BaseAdapter {

        private LayoutInflater myInflater;

        private List<CImage> ImgList;

        public GridViewAdapter(Context context,List<CImage> ImgList) {
            myInflater = LayoutInflater.from(context);
            this.ImgList = ImgList;
        }


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

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

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

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

            ViewHolder holder = null;


            if(convertView == null)
            {
                convertView = myInflater.inflate(R.layout.item_gridview_member,null);
                holder = new ViewHolder();
                holder.imageView = convertView.findViewById(R.id.image_meme);
                convertView.setTag(holder);
            }

            CImage image = ImgList.get(position);

            holder.imageView.setImageBitmap(image.getBitmap());

            if (image.getBitmap() == null) {
                holder.imageView.setImageResource(R.mipmap.ic_launcher);
            } else {
                holder.imageView.setImageBitmap(image.getBitmap());
            }

            return convertView;
        }

        public class ViewHolder {
            ImageView imageView;
        }

    }

MapFregement.java

    public class MemberFragment extends Fragment {


        private GridViewAdapter adapter;

        private ArrayList<CImage> imageList;

        public MemberFragment() {
            // Required empty public constructor
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_member, container, false);

        }
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            inital();
            adapter = new GridViewAdapter(getActivity(),imageList);
            grieview.setAdapter(adapter);

        }

        public void inital(){

            grieview = getActivity().findViewById(R.id.gridmember);

        }
        GridView grieview;
    }

Thank you!!


Solution

  • After looking into code, i think issue was with your GridView in MemberFragment class.

    You're inflating view into fragment using inflater and trying to resolve id using activity context. Also, you need to override onViewCreated() in Fragment.

    What is usage of onViewCreated()?

    Called immediately after onCreateView(LayoutInflater, ViewGroup, Bundle) has returned, but before any saved state has been restored in to the view. This gives subclasses a chance to initialize themselves once they know their view hierarchy has been completely created. The fragment's view hierarchy is not however attached to its parent at this point.


    Your MemberFragment.java:

    public class MemberFragment extends Fragment {
    
        private GridView grieview;
        private GridViewAdapter adapter;
        private ArrayList<CImage> imageList;
    
        public MemberFragment() {
            // Required empty public constructor
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_member, container, false);
    
        }
    
        //Note: Change is from here, Instead of onActivityCreated(), override this method. Use View object from it.
        @Override
        void onViewCreated (View view, Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            inital(view); // Get the View Object provided from method parameter to find your fragment layout view IDs, It's the same View you return in onCreateView method.
            adapter = new GridViewAdapter(getActivity(),imageList);
            grieview.setAdapter(adapter);
        }
    
        public void inital(View view){
            grieview = view.findViewById(R.id.gridmember); //Find your view inside fragment like this.
        }
    
    }
    

    I hope it helps !