Search code examples
androidlistviewfragmentcustom-adapterlistitem

first and last item of listView are same


I want to display list using custom arrayadapter, the problem is my first and last item are same actually there are four items in my ArrayList but fourth item is not displaying and instead it's showing the first item and sometimes vice versa.here is my code, I am a complete beginner so don't know which code is necessary to post here.

Place.java (custom class for list item)

/** Image resource ID for the Place */
private int mImageResourceId;
/**Description ID for the Place */
private  int mDescriptionId;
/**Name ID for the Place */
private  int mNameId;

/**
 * Create a new Word object.
 *
 * @param imageResourceId is the image resource ID for the image of place
 * @param nameId is the string resource Id for the name of place
 * @param descriptionId is the  string resource ID for the description associated with this place
 */
public Place(int imageResourceId, int nameId, int descriptionId) {
    mImageResourceId = imageResourceId;
    mNameId= nameId;
    mDescriptionId =descriptionId;
}

public int getImageResourceId (){return mImageResourceId;}

public int getDescriptionId(){return mDescriptionId;}

public  int getNameId() {return mNameId;}}

PlaceAdapter.java (custom Adapterfor my lsit)

public class PlaceAdapter extends ArrayAdapter<Place> {


public PlaceAdapter(Context context, ArrayList<Place> place) {
    super(context, 0, place);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.list_item, parent, false);

        Place currentPlace = getItem(position);

        TextView name = (TextView) listItemView.findViewById(R.id.name);
        name.setText(currentPlace.getNameId());

        TextView description = (TextView) listItemView.findViewById(R.id.description);
        description.setText(currentPlace.getDescriptionId());

        ImageView image = (ImageView) listItemView.findViewById(R.id.image);
        image.setImageResource(currentPlace.getImageResourceId());

    }
    return listItemView;
}
}

HistoricFragment.java(fragment contains a listView)

public class HistoricFragment extends Fragment {

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

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

    // Create a list of Place
    final ArrayList<Place> place = new ArrayList<Place>();
    place.add(new Place(R.drawable.badshahi_mosque, R.string.badshahi_name,
            R.string.badshahi_description));
    place.add(new Place(R.drawable.lahore_fort, R.string.fort_name,
            R.string.fort_description));
    place.add(new Place(R.drawable.sheesh_mahal_lahore_fort, R.string.mahal_name,
            R.string.mahal_description));
    place.add(new Place(R.drawable.wazir_mosque, R.string.wazir_khan_name,
            R.string.wazir_mosque_description));

    // Create an {@link PlaceAdapter}, whose data source is a list of {@link Place}s. The
    // adapter knows how to create list items for each item in the list.
    PlaceAdapter adapter = new PlaceAdapter(getActivity(), place);

    // Find the {@link ListView} object in the view hierarchy of the {@link Activity}.
    // There should be a {@link ListView} with the view ID called list, which is declared in the
    // place_list.xml layout file.
    ListView listView = (ListView) rootView.findViewById(R.id.list);

    // Make the {@link ListView} use the {@link PlaceAdapter} we created above, so that the
    // {@link ListView} will display list items for each {@link Place} in the list.
    listView.setAdapter(adapter);

    return  rootView;
}
}

Solution

  • Change your code like this

    public class PlaceAdapter extends ArrayAdapter<Place> {
    
    
        public PlaceAdapter(Context context, ArrayList<Place> place) {
            super(context, 0, place);
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            ViewHolder holder;
            View listItemView;
            if (convertView == null) {
                listItemView = LayoutInflater.from(getContext()).inflate(
                        R.layout.list_item, parent, false);
    
                holder = new ViewHolder();
                holder.name = (TextView) listItemView.findViewById(R.id.name);
                holder.description = (TextView) listItemView.findViewById(R.id.description);
                holder.image = (ImageView) listItemView.findViewById(R.id.image);
    
                convertView.setTag(holder);
            }
    
            holder = (ViewHolder) convertView.getTag();
    
            Place currentPlace = getItem(position);
            holder.name.setText(currentPlace.getNameId());
            holder.description.setText(currentPlace.getDescriptionId());
            holder.image.setImageResource(currentPlace.getImageResourceId());
            return convertView;
        }
    
        public static class ViewHolder {
            TextView name;
            TextView description;
            ImageView image;
        }
    
    }