2012-06-03 4 views
12

добавить ListView во время выполнения, как это:android.widget.LinearLayout не может быть приведен к android.widget.TextView

 MainMenue = getResources().getStringArray(R.array.Unit); 
    // remove all controls 
    LinearLayout formLayout = (LinearLayout)findViewById(R.id.submenue); 
    formLayout.removeAllViews(); 
    menueview = new ListView(getApplicationContext());    
    menueview.setVisibility(ListView.VISIBLE); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    params.gravity = Gravity.RIGHT; 
    menueview.setLayoutParams(params); 
    menueview.setAdapter(new submenueadapter(menueview.getContext(), MainMenue)); 
    // Set the on Item 
    SetMenueOnClick() ; 
    formLayout.addView(menueview); 

, а затем добавить элемент щелчка слушателя, как это:

public void SetMenueOnClick() { 
    menueview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       final String text = (String) ((TextView)view).getText(); 
      } 
    }); 
} 

Но тогда у меня ошибка:

06-03 10:59:25.862: E/AndroidRuntime(14732): at android.view.ViewRoot.handleMessage(ViewRoot.java:2109) 
android.widget.LinearLayout cannot be cast to android.widget.TextView 

на этой линии:

final String text = (String) ((TextView)view).getText(); 

Любая идея, как получить текст в этом выпуске? адаптер выглядит следующим образом:

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View rowView = inflater.inflate(R.layout.shortmenue, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.contents); 

    textView.setText(values[position]); 

    // Change icon based on name 
    String s = values[position]; 

    System.out.println(s); 

    rowView.setBackgroundResource(R.drawable.alternate_list_color); 
    return rowView; 
} 

и R.layout.shortmenue прост, только TextView, как показано ниже:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

       <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/contents" 
       android:textSize="34dp" 

       /> 

</LinearLayout> 

ответ

16

Ваша строка является TextView обернут LinearLayout, так что вы можете сделать это:

LinearLayout ll = (LinearLayout) view; // get the parent layout view 
TextView tv = (TextView) ll.findViewById(R.id.contents); // get the child text view 
final String text = tv.getText().toString(); 
9

Если у вас работает аналогичная проблема, но вы уверены, что у вас есть ориентир линейной линии:

Удалить файл gen/your.app.package/R.java.

Это происходит из-за ошибки xml, когда вы удаляете R.java, она будет воссоздана при следующей сборке/запуске.

+0

Работал! Достаточно глупо: p –

+2

Или просто попробуйте нажать кнопку REBUILD –

1

Я просто добавил android: id = "@ + id/my_layout" в LinearLayout, который завернул TextView и решил аналогичную проблему.

+0

Как ни странно, это также решило мою проблему list_item.xml, в которой у меня было несколько элементов, но не было установлено идентификатор LinearLayout, содержащий их. Как-то андроид не может отличить его от обычного вида, вероятно, потому, что у него нет типа R.layout без id, поэтому он пытается его выполнить и терпит неудачу. –

0

У меня была такая же проблема, и я просто переименовал вставленный объект вида.

Как это:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/newTextViewName" 
    android:textSize="34dp" 
/> 
0

В моем случае, если XML содержит TextView, но я сделал ошибку написания

final TextView text = (TextView) inflater.inflate(R.layout.item_text, layout); 

вместо

final TextView text = (TextView) inflater.inflate(R.layout.item_text, layout, false); 
0

Вы можете решить это, замена

final String text = (String) ((TextView)view).getText(); 

с

TextView temp= (TextView) view.findViewById(R.id.textView); 

Это работает для меня.

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