我想使用自定义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 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(片段包含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 :(得分: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模式。
答案 1 :(得分: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;
}
}