ClassCastException:android.widget.RelativeLayout无法强制转换为android.widget.TextView?

时间:2016-06-10 22:59:21

标签: java android

我试图输入演员数据但是当我在onItemClick(...)下写TextView clickData=(TextView) view时,logcat显示msg:

  

java.lang.ClassCastException:android.widget.RelativeLayout无法强制转换为android.widget.TextView

我不知道为什么。

这属于主要活动:

  public class ListViewForAllContact extends AppCompatActivity {
        ListView myListView;
        protected  void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listviewforallcontact);



            ContactDatabase onbOfContactDatabase=new ContactDatabase(getBaseContext());

            Cursor mCursor= onbOfContactDatabase.phoneName();

            String[] fromFileName=new String[]{ContactDatabase.NAME};
            int[] toViewId=new int[]{R.id.textView5};
            SimpleCursorAdapter simpleCursorAdapter;

            simpleCursorAdapter=new SimpleCursorAdapter(this,R.layout.forreading,mCursor,fromFileName,toViewId,0);
             myListView=(ListView)findViewById(R.id.listView);
            myListView.setAdapter(simpleCursorAdapter);

            myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    TextView clickData=(TextView) view;//becouse of this line error will come.

                    Toast.makeText(getBaseContext(), clickData.getText(), Toast.LENGTH_LONG).show();
                }
            });

        }
    }

这是带有ListView的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

这是第二个带有TextView的XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView5"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>





</RelativeLayout>

2 个答案:

答案 0 :(得分:1)

您希望访问其在第二个xml上显示的RelativeLayout的视图。如果要访问TextView,则必须在RelativeLayout上找到它。

而不是这个

  

TextView clickData =(TextView)视图;

试试这个

  

TextView clickData =(TextView)view.findViewById(R.id.textView5);

我认为这可以解决您的问题

...更新

我的建议是使用适配器

  

公共类YourAdapter扩展了BaseAdapter {

private ArrayList<Things> things;
private Context context;
private TextView yearTxtView;
private TextView weekTxtView;
private TextView extraTxtView;


public YourAdapter(Context context, ArrayList<Things> things) {
    this.things = things;
    this.context = context;
}

@Override
public int getCount() {
    return this.things.size();
}

@Override
public Object getItem(int position) {
    return this.things.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView =     LayoutInflater.from(this.context).inflate(R.layout.ITEM_LAYOUT, parent, false);

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //do your code here
        }
    });

    return convertView;


}

}

并且根据您的代码,只需执行此操作

  

私人YourAdapter yourAdapter;

     

this.yourAdapter = new YourAdapter(getActivity(),YourArray);

     

myListView.setAdapter(this.yourAdapter);

答案 1 :(得分:0)

Android 编译器似乎变得非常具体。我遇到了同样的问题,很遗憾,因为这是每个示例程序和Android developer forum or guide上的那种代码。解决方案是对待编译器,向它提供它所要求的内容,在本例中为textview (android.widget.TextView)。

移除 TextView 周围的布局框架(LinearLayout、RelativeLayout 等)并相信在 ListView 父小部件内膨胀时,它将“在代码世界中找到自己的方式”。所以,放开它。

因此您可以根据需要定义 TextView 的属性,声明 android 架构 (xmlns:android="http://schemas.android.com/ apk/res/android") 在 TextView 本身中。之后,编译就不会混淆了,一切都应该编译了。