2017-08-30 88 views
-1

我想用自定義的arrayadapter顯示列表,問題是我的第一個和最後一個項目是相同的居然有我的ArrayList的四個項目,但第四個項目沒有顯示,而是它表示第一項目,有時反之亦然。這裏是我的代碼,我是一個完整的初學者,所以不知道在這裏發佈哪些代碼是必要的。第一和最後一個項目是相同

Place.java(用於列表項自定義類)

/** 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(定製Adapterfor我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(片段包含一個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; 
} 
} 

回答

0

更改您這樣的代碼

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; 
    } 

} 
0
@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; 
} 

這將解決這一問題。但你可以谷歌和使用更有效的Viewholder模式。

+0

這幫助表示感謝。 – Aashir

+0

永遠歡迎:-) –

相關問題