2

На Android У меня есть 3 классаInstanceOf не возвращает правильный ответ

GENERALBOOK

public class General_Book { 
protected String Titolo; 
protected int Tag; 

public General_Book(String t, int i) { 
    Titolo = t; 
    Tag=i; 
} 

public General_Book() { 
    // 
} 

public void setTitolo(String t) { 
    Titolo=t; 
} 
public void setTag(int i) { 
    Tag=i; 
} 
public String getTitolo() { 
    return Titolo; 
} 
public int getTag() { 
    return Tag; 
} 
} 

MOSTBOOK

public class Most_Book extends General_Book { 
private String SubTitolo; 
private float Rating; 

public Most_Book(String t,String s,float d, int c) { 
    super(t,c); 
    SubTitolo=s; 
    Rating=d; 
} 
public void setSubTitolo(String t) { 
    SubTitolo=t; 
} 
public void setRating(float c) { 
    Rating=c; 
} 
public String getSubTitolo() { 
    return SubTitolo; 
} 
public float getRating() { 
    return Rating; 
} 
} 

и TOPBOOK

public class Top_Book extends General_Book{ 
private String Incipit; 
private String imageUri; 
public Top_Book(String t,String i,String u, int c) { 
    super(t,c); 
    Incipit=i; 
    imageUri=u; 
} 
public Top_Book() { 

} 
public void setIncipit(String i) { 
    Incipit=i; 
} 
public void setImageURI(String u) { 
    imageUri=u; 
} 
public String getIncipit() { 
    return (Incipit.length()>120) ? Incipit.substring(0, 117) + "..." : Incipit; 

} 
public String getImageURI() { 
    return imageUri; 
} 
    } 

Сейчас на активности у меня есть 2 ListView один с TopBook и еще один с MostBook Я создал CustomArrayAdapter, который управляет как тип, но он не работает, как я ожидаю, Поскольку всегда входят в первую ПЧ «InstanceOf» , и я понятия не имею, почему, не могли бы вы помочь мне и объяснить, что я делаю неправильно?

CUSTOMARRAYADAPTER

public class CustomArrayGeneralBook extends ArrayAdapter<General_Book> { 
private final LayoutInflater mInflater; 
public ImageLoader imageLoader; 
public CustomArrayGeneralBook(Context context,General_Book[] tops) { 
    super(context,android.R.layout.simple_list_item_2,tops); 
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader = new ImageLoader(context); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if (convertView == null) { 
     view = mInflater.inflate(R.layout.fragment_home_child_mostbook, parent, false); 
    } else { 
     view = convertView; 
    } 
    Object o = getItem(position); 
    if(o instanceof General_Book) { 
     Log.e("A","QUI"); 
     General_Book item = getItem(position); 
     view.setTag(item.getTag()); 
    } 
    else if (o instanceof Most_Book) { 
     Log.e("A","QUI2"); 
     Most_Book item = (Most_Book) getItem(position); 
     ((TextView)view.findViewById(R.id.most_book_title)).setText(item.getTitolo()); 
     ((TextView)view.findViewById(R.id.most_book_subtitle)).setText(item.getSubTitolo()); 
     ((RatingBar)view.findViewById(R.id.most_book_ratingbar)).setRating(item.getRating()); 
     view.setTag(item.getTag()); 
    } 
    else if (o instanceof Top_Book) { 
     Log.e("A","QUI3"); 
     Top_Book item = (Top_Book) getItem(position); 
     ((TextView)view.findViewById(R.id.top_book_title)).setText(item.getTitolo()); 
     ((TextView)view.findViewById(R.id.top_book_incipit)).setText(item.getIncipit()); 
     imageLoader.DisplayImage(item.getImageURI(), (ImageView)view.findViewById(R.id.top_book_cov)); 
     view.setTag(item.getTag()); 
    }  
    return view; 
} 
} 

EDIT Хорошо, что работает в конце с anwser я принял, только чтобы прояснить все:
мне пришлось добавить другой Inflater.inflate (R.layout ....) в каждом случае, если не разбивать приложение :)
Спасибо

ответ

1

Экземпляр Most_Book также является экземпляром General_Book, потому что Most _Book расширяет General_Book. (то же самое касается Top_Book).

В вашем случае, вам необходимо проверить для самых конкретных значений первых:

if(o instanceof Most_Book) { 
    //... 
} else if (o instanceof Top_Book) { 
    //... 
} else if (o instanceof General_Book) { 
    //... 
} 
+0

Спасибо, что работает :) Ожидание подтверждения вашего ответа –

0

Я считаю, что вам необходимо поместить в if сек другой путь. Потому что если o является экземпляром Most_Book, General_Book или Top_Book, он войдет в первый if. General_Book является родительским классом Top_Book и Most_Book a является наиболее обобщенным. Запустите проверку if() со специализированными, а затем перейдите к обобщенным.

if(o instanceof Top_Book) { 
//... 
} else if (o instanceof Most_Book) { 
//... 
} else if (o instanceof General_Book) { 
//... 
} 

JLS 15.20.2 см

Во время выполнения, результатом оператора InstanceOf является истинным, если значение ВыражениеОтношения не равно нулю, и ссылка может быть брошен (§15.16) к ReferenceType без повышение класса ClassException. В противном случае результат будет ложным.

Если o является экземпляром Top_Book или Most_Book, то ниже в порядке.

General_Book b = o; 

Поэтому if(o instanceof General_Book) всегда будет true.

Смежные вопросы