#android #class #object #replace #new-operator
#Android #класс #объект #заменить #new-operator
Вопрос:
Это мой класс
public class ListItem {
private String title, subtitle;
private int itemImageResourceId;
public ListItem (String mtitle, String msubtitle, int mitemImageResourceId){
title = mtitle;
subtitle = msubtitle;
itemImageResourceId = mitemImageResourceId;
}
public String gettitle() {
return title;
}
public String getsubtitle() {
return subtitle;
}
public int getitemImageResourceId() {
return itemImageResourceId;
}
}
и вот как я создаю свой объект и помещаю его в список массивов
ListItem myObject = new ListItem("Title 1", "Sub Title 1", R.drawable.img1);
ListItem myObject2 = new ListItem("Title 2", "Sub Title 2", R.drawable.img2);
ListItem myObject3 = new ListItem("Title 3", "Sub Title 4", R.drawable.img3);
ListItem myObject4 = new ListItem("Title 4", "Sub Title 4", R.drawable.img4);
ListItem myObject5 = new ListItem("Title 5", "Sub Title 5", R.drawable.img5);
ListItem myObject6 = new ListItem("Title 6", "Sub Title 6", R.drawable.img1);
ListItem myObject7 = new ListItem("Title 7", "Sub Title 7", R.drawable.img2);
ListItem myObject8 = new ListItem("Title 8", "Sub Title 8", R.drawable.img4);
ListItem myObject9 = new ListItem("Title 9", "Sub Title 9", R.drawable.img5);
ArrayList<ListItem> mylistview = new ArrayList<ListItem>(
Arrays.asList(myObject, myObject2, myObject3, myObject4, myObject5, myObject6, myObject7, myObject8, myObject9));
но каждый раз, когда я запускаю код, 9-й элемент в отображаемом списке отображает значения для первого элемента. Я не знаю, почему новый объект, созданный из этого класса, заменяется старыми объектами? Кто-нибудь, пожалуйста, помогите, я пытался исправить это в течение 6 часов.
код адаптера
public class MyListView extends ArrayAdapter<ListItem> {
//private static final String LOG_TAG = ListItem.class.getSimpleName();
Context mContext;
int mResource;
ArrayList<ListItem> mobjects;
public MyListView(Context context, int resource, ArrayList<ListItem> objects) {
super(context, resource, objects);
mContext = context;
mResource = resource;
mobjects = objects;
}
public static class ViewHolder{
RelativeLayout _layout;
ImageView _selicon;
TextView _seltitle;
TextView _selsubtitle;
ImageButton _selimgbutton;
}
public View getView(int position, View view, ViewGroup parent) {
View listItemView = view;
final ViewHolder holder;
if(listItemView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
listItemView = inflater.inflate(mResource, parent,false);
holder = new ViewHolder();
holder._layout = listItemView.findViewById(R.layout.my_list);
ListItem currentitem = getItem(position);
holder._selicon = listItemView.findViewById(R.id.icon);
holder._seltitle = listItemView.findViewById(R.id.title);
holder._selsubtitle = listItemView.findViewById(R.id.subtitle);
holder._selimgbutton = listItemView.findViewById(R.id.imgbutton);
holder._seltitle.setText(currentitem.gettitle());
holder._selicon.setImageResource(currentitem.getitemImageResourceId());
holder._selsubtitle.setText(currentitem.getsubtitle());
holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
if (item.getTitle().equals("Good")) {
Toast.makeText(mContext, "You Clicked Good: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else if (item.getTitle().equals("Bad")){
Toast.makeText(mContext, "You Clicked Bad: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else {
return onMenuItemClick(item);
}
return true;
}
});
popup.show();
}
});
listItemView.setTag(holder);
}else{
holder = (ViewHolder) listItemView.getTag();
}
return listItemView;
}
}
Комментарии:
1. опубликуйте свой код адаптера
2. У меня есть обновление с моим кодом адаптера
Ответ №1:
Вы забыли установить значения держателя на случай, если он взят из тега:
public View getView(int position, View view, ViewGroup parent) {
View listItemView = view;
final ViewHolder holder;
final ListItem currentitem = getItem(position);
if (listItemView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
listItemView = inflater.inflate(mResource, parent,false);
holder = new ViewHolder();
holder._layout = listItemView.findViewById(R.layout.my_list);
holder._selicon = listItemView.findViewById(R.id.icon);
holder._seltitle = listItemView.findViewById(R.id.title);
holder._selsubtitle = listItemView.findViewById(R.id.subtitle);
holder._selimgbutton = listItemView.findViewById(R.id.imgbutton);
holder._seltitle.setText(currentitem.gettitle());
holder._selicon.setImageResource(currentitem.getitemImageResourceId());
holder._selsubtitle.setText(currentitem.getsubtitle());
holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
if (item.getTitle().equals("Good")) {
Toast.makeText(mContext, "You Clicked Good: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else if (item.getTitle().equals("Bad")){
Toast.makeText(mContext, "You Clicked Bad: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else {
return onMenuItemClick(item);
}
return true;
}
});
popup.show();
}
});
listItemView.setTag(holder);
} else {
holder = (ViewHolder) listItemView.getTag();
holder._seltitle.setText(currentitem.gettitle());
holder._selicon.setImageResource(currentitem.getitemImageResourceId());
holder._selsubtitle.setText(currentitem.getsubtitle());
holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
if (item.getTitle().equals("Good")) {
Toast.makeText(mContext, "You Clicked Good: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else if (item.getTitle().equals("Bad")){
Toast.makeText(mContext, "You Clicked Bad: " holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
}else {
return onMenuItemClick(item);
}
return true;
}
});
popup.show();
}
});
}
return listItemView;
}
Ответ №2:
Можете ли вы добавить этот способ? = —
ListItem myObject = new ListItem("Title 1", "Sub Title 1", R.drawable.img1);
ListItem myObject2 = new ListItem("Title 2", "Sub Title 2", R.drawable.img2);
ListItem myObject3 = new ListItem("Title 3", "Sub Title 4", R.drawable.img3);
ListItem myObject4 = new ListItem("Title 4", "Sub Title 4", R.drawable.img4);
ListItem myObject5 = new ListItem("Title 5", "Sub Title 5", R.drawable.img5);
ListItem myObject6 = new ListItem("Title 6", "Sub Title 6", R.drawable.img1);
ListItem myObject7 = new ListItem("Title 7", "Sub Title 7", R.drawable.img2);
ListItem myObject8 = new ListItem("Title 8", "Sub Title 8", R.drawable.img4);
ListItem myObject9 = new ListItem("Title 9", "Sub Title 9", R.drawable.img5);
ArrayList<ListItem> mylistview = new ArrayList<ListItem>(
mylistview.add(myObject)
mylistview.add(myObject2)
mylistview.add(myObject3)
mylistview.add(myObject4)
mylistview.add(myObject5)
mylistview.add(myObject6)
mylistview.add(myObject7)
mylistview.add(myObject8)
mylistview.add(myObject9)