Mảng ArrayAd CHƯƠNG yêu cầu ID tài nguyên phải là một vấn đề Textml.


181

Tôi gặp lỗi khi cố gắng đặt chế độ xem của mình để hiển thị ListViewcho tệp tôi muốn hiển thị (tệp văn bản). Tôi khá chắc chắn rằng nó có một cái gì đó để làm với xml. Tôi chỉ muốn hiển thị thông tin từ this.file = fileop.ReadFileAsList("Installed_packages.txt");. Mã của tôi:

public class Main extends Activity {
    private TextView tv;
    private FileOperations fileop;
    private String[] file;

    /** Called when the activity is first created. */       
    @Override
    public void onCreate(Bundle savedInstanceState) {           
        super.onCreate(savedInstanceState); 
        this.fileop = new FileOperations(); 
        this.file = fileop.ReadFileAsList("Installed_packages.txt"); 
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.TextView01);
        ListView lv = new ListView(this);
        lv.setTextFilterEnabled(true); 
        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, this.file)); 
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

              public void onItemClick(AdapterView<?> parent, View view,     int position, long id) { 
                    // When clicked, show a toast with the TextView text 
                    Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
              } 
        });         
        setContentView(lv);
    }

}

list_item.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:padding="10dp"   
    android:textSize="16sp"   
    android:textColor="#000">

</LinearLayout>

tệp chính :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="1">
<ScrollView
    android:id="@+id/SCROLLER_ID"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:fillViewport="true">
        <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:padding="5sp"
        android:id="@+id/TextView01"
        android:text="@string/hello"/>
    </ScrollView>

</LinearLayout>

Câu trả lời:


427

Các ArrayAdapter đòi hỏi ID tài nguyên là một TextView XML phương tiện ngoại lệ bạn không cung cấp những gì ArrayAdaptermong đợi. Khi bạn sử dụng hàm tạo này:

new ArrayAdapter<String>(this, R.layout.a_layout_file, this.file)

R.Layout.a_layout_filephải là id của tệp bố cục xml chỉ chứa một TextView( TextView không thể được bao bọc bởi bố cục khác, như a LinearLayout, RelativeLayoutv.v.), đại loại như thế này:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    // other attributes of the TextView
/>

Nếu bạn muốn bố trí hàng danh sách của mình khác biệt một chút thì một TextViewwidget đơn giản sử dụng hàm tạo này:

new ArrayAdapter<String>(this, R.layout.a_layout_file, 
   R.id.the_id_of_a_textview_from_the_layout, this.file)

nơi bạn cung cấp idbố cục có thể chứa nhiều chế độ xem khác nhau, nhưng cũng phải chứa a TextViewid(tham số thứ ba) mà bạn chuyển đến để bạn ArrayAdaptercó thể biết vị trí đặt Stringsbố cục trong hàng.


2
Có vấn đề tương tự vì TextView của tôi nằm trong linearLayout trong tệp xml.
Valentin Despa

Đã thử điều này trên trình đơn thả xuống tự động hoàn thành mà tôi có nhưng nó không cho phép cuộn và cũng không cho phép tôi chọn bất kỳ mục nào trong danh sách
kabuto178

29
TextView có thể được gói trong bố cục khác (tôi vừa mới làm nó). Để làm điều đó, hãy sử dụng hàm tạo khác new ArrayAdapter<String>(this, R.layout.a_layout_file, R.id.a_text_view_within_layout, this.file)Xem javadoc choandroid.widget.ArrayAdapter
Petr Gladkikh

6
Bạn đã không đọc câu trả lời của tôi rất tốt: Khi bạn sử dụng hàm tạo này : ... (TextView không thể được bao bọc bởi một bố cục khác, như là linearLayout, RelativeLayout, v.v.) . Nó có thể được bao bọc bởi bất cứ điều gì bạn muốn với phiên bản constructor thứ hai cũng có id (như tôi đã đề cập trong phần thứ hai của câu trả lời của tôi).
Luksprog

6
Cảm ơn bạn rất nhiều! Tôi đã dành ba giờ đập đầu vào tường. Các tài liệu tham khảo khác nói rằng bạn chỉ có thể có MỘT TextView, nhưng tôi không thể tìm thấy yêu cầu hết sức quan trọng của "TextView không thể được bao bọc bởi một bố cục khác, như là linearLayout." Whew, snip snip và nó hoạt động như một bùa mê. Một lần nữa cám ơn!
Scott Biggie

31

Soution ở đây

listitem.xml

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

     <TextView
         android:id="@+id/textview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
     </TextView>
</LinearLayout>

Mã Java:

 String[] countryArray = {"India", "Pakistan", "USA", "UK"};
 ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.listitem,R.id.textview, countryArray);
 ListView listView = (ListView) findViewById(R.id.listview);
 listView.setAdapter(adapter);

1
Tôi biết điều này có vẻ như là không có trí tuệ, nhưng nhìn vào tài liệu cho các nhà xây dựng ArrayAd CHƯƠNG cũng giúp tôi hiểu. liên kết
luckyging3r

1

Nếu bạn nhận được thông báo đó khi bạn mở rộng ArrayAd CHƯƠNG, bạn sẽ gặp lỗi đó vì bạn chưa cung cấp id tài nguyên chính xác để hiển thị mục đó. Gọi siêu lớp trong hàm tạo và truyền vào id tài nguyên của TextView:

    //Pass in the resource id:  R.id.text_view
    SpinnerAdapter spinnerAddToListAdapter = new SpinnerAdapter(MyActivity.this,
            R.id.text_view,
            new ArrayList<>());

Bộ chuyển đổi:

public class SpinnerAdapter extends ArrayAdapter<MyEntity> {

    private Context context;
    private List<MyEntity> values;

    public SpinnerAdapter(Context context, int textViewResourceId,
                          List<MyEntity> values) {

        //Pass in the resource id:  R.id.text_view
        super(context, textViewResourceId, values);

        this.context = context;
        this.values = values;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.