今日まで 2 つのビューを配置した ListView があります。1 つの ImageView をその親の左側に配置し、次にこの ImageView のすぐ右側に配置された TextView を使用します。xml では、次のコードを使用してそれを行います。
android:layout_toRightOf="@+id/single"、 single は ImageView です。
...だから何の問題もありません:-)
しかし、今日、私は新しいアイデアを思いつきました - この ListView に別の ImageView が欲しいということです。この新しいビューを親 (ListView) の右側に配置しました。
android:layout_alignParentRight="true"
これを行ったときに小さな問題が発生しました。TextView に長い文がある場合、この新しい ImageView と重なってしまいます。しかし、アンドロイドのドキュメントによると、私はこのコードを見つけました:
android:layout_toStartOf="@+id/volume"。 volume は新しい ImageView の ID です。
私はそれがうまくいくと本当に思った。to the end of means このビューの終了エッジを、指定されたアンカー ビュー ID の開始位置に配置します。[参照]
だから私はすべてがうまくいくと思っていましたが、アプリをコンパイルしてテストを開始すると、リストビューをクリックするとアプリがクラッシュしました。クラッシュは classcastexception によるものです。ImageView は TextView にキャストできません
だから私の質問は、なぜこの ClassCastException を取得するのですか? 私が行う唯一のことは、TextView の終了エッジを ImageView の開始点に配置することです。toStartOf を使用すると classcastException が発生するのはなぜですか? xml-code android:layout_toRightOf="@+id/single"を使用して、 TextView を他の ImageView の右側に配置しても例外は発生しません
要約すると、私の目標は、この ListView に 3 つのビューを含めることです。2 つの ImageView - 1 つは左に、もう 1 つは右に。そして、これら 2 つの ImageView の間に TextView を配置します。
getChildView メソッドで例外が発生します。
<!-- Layout för undermenyerna -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="5dp"
android:paddingLeft="0px"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="0px"
android:background="#ffffff"
tools:context=".PhraseActivity" >
<!-- view för ena ena könet, man eller kvinna -->
<TextView
android:id="@+id/label_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@+id/single"
android:layout_toStartOf="@+id/volume"
android:la
/>
<!-- texview för båda könen, man och kvinna -->
<TextView
android:id="@+id/label_couple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/couple"
/>
<!-- texview för extra info -->
<TextView
android:id="@+id/extra_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/couple"
android:layout_marginTop="10sp"
android:background="@drawable/back_extrainfo"
android:padding="5sp"
android:visibility="gone"
android:textColor="#8c8c8c"
/>
<!-- text länk till bild, tex karta som visar vart staden är i Thailand -->
<TextView
android:id="@+id/imagelink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:focusableInTouchMode="true"
android:text="Click to view on map"
android:textColor="#3241d3"
android:layout_centerHorizontal="true"
android:layout_below="@+id/couple"
/>
<!-- text länk till bild, samma syfte som texviewen ovan -->
<TextView
android:id="@+id/imagelink2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="Click to view image"
android:focusableInTouchMode="true"
android:textColor="#3241d3"
android:layout_centerHorizontal="true"
android:layout_below="@+id/extra_info"
/>
<!-- view för en bild av ena könet, man eller kvinna -->
<ImageView
android:id="@+id/single"
android:layout_width="68sp"
android:layout_height="68sp"
/>
<!-- view för en bild av båda könen, man och kvinna -->
<ImageView
android:id="@+id/couple"
android:layout_width="100sp"
android:layout_height="68sp"
/>
<ImageView
android:id="@+id/volume"
android:layout_width="100sp"
android:layout_height="79sp"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activity_subphrase, parent, false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.label_single);
holder.text2 = (TextView) convertView.findViewById(R.id.label_couple);
holder.imageView = (ImageView) convertView.findViewById(R.id.single);
holder.imageView2 = (ImageView) convertView.findViewById(R.id.couple);
holder.volumeControl = (ImageView) convertView.findViewById(R.id.volume);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final int nChildren = getChildrenCount(groupPosition);
final View v = convertView;
switch (nChildren) {
case 1:
holder.imageView.setBackgroundResource(0);
holder.imageView2.bringToFront();
holder.imageView2.setVisibility(ImageView.VISIBLE);
holder.text.setText(null);
holder.text2.setText(contents[groupPosition][childPosition]);
holder.imageView2.setBackgroundResource(R.drawable.man_woman_3);
//extra(groupPosition, category, holder.text, convertView, parent);
showThaiImages(groupPosition, holder.text, convertView, parent);
// Väntar till all layout är avklarad - efter detta bearbetas animering.
vto = convertView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
v.getViewTreeObserver().removeOnGlobalLayoutListener(this); //vet inte om denna metod är nödvändig
holder.imageView2.bringToFront();
holder.imageView2.setBackgroundResource(R.drawable.animation3);
frameAnimation = (AnimationDrawable) holder.imageView2.getBackground();
frameAnimation.start();
}});
break;
case 2:
try {
System.out.println("ViewTreeObserver is alive = : " + vto.isAlive());
} catch (Exception e) {
e.printStackTrace();
}
//v.getViewTreeObserver().removeOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()); //vet inte om denna metod är nödvändig
holder.imageView2.setVisibility(View.GONE);
holder.imageView2.setBackgroundResource(0);
holder.imageView.bringToFront();
holder.text2.setText(null);
//holder.imageView.invalidate();
holder.text.setText(contents[groupPosition][childPosition]);
switch (childPosition) { // Switch-villkor för man eller kvinna.
case 0: // Man.
holder.imageView.setBackgroundResource(R.drawable.man_3);
break;
case 1: // Kvinna.
holder.imageView.setBackgroundResource(R.drawable.woman_3);
break;
}
break;
}
holder.volumeControl.setBackgroundResource(R.drawable.speaker);
notifyDataSetChanged();
return convertView;
}