解析listview适配器您必须为textview提供资源ID

时间:2014-05-02 17:33:40

标签: java android listview adapter

我发现了很多同样的问题,但我真的不知道解决问题的方法。我有一个简单的Costumer parse.com类,并希望列出名称。 (所有这些。)

Logcat说:

05-02 19:31:46.534: E/ArrayAdapter(12816): You must supply a resource ID for a TextView
05-02 19:31:46.534: D/AndroidRuntime(12816): Shutting down VM
05-02 19:31:46.534: W/dalvikvm(12816): threadid=1: thread exiting with uncaught exception (group=0x41cd1700)
05-02 19:31:46.574: E/AndroidRuntime(12816): FATAL EXCEPTION: main
05-02 19:31:46.574: E/AndroidRuntime(12816): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView

我认为我的ID存在问题。我之前从未使用过适配器。

// RemoteDataTask AsyncTask
private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setTitle("Wait! Listing customers!");
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                "Customers");
        // query.orderByDescending("_created_at");
        try {
            ob = query.find();
        } catch (ParseException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        listview = (ListView) findViewById(R.id.listview);
        adapter = new ArrayAdapter<String>(MainActivity.this,
                R.layout.activity_main);

        for (ParseObject customer : ob) {
            adapter.add((String) customer.get("name"));
        }
        listview.setAdapter(adapter);
        mProgressDialog.dismiss();
    }

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.csaba.noteapp.MainActivity"
tools:ignore="MergeRootFrame" >

<TextView
    android:id="@+id/tvname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Name:"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/etname"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" />

<TextView
    android:id="@+id/tvphone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Phone:"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/etphone"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="number" >

    <requestFocus />
</EditText>

<TextView
    android:id="@+id/tvcity"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="City:"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/etcity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" />

<Button
    android:id="@+id/buttonlist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="List of customers" />

<Button
    android:id="@+id/buttonadd"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Add costumer" />

  <ListView
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

2 个答案:

答案 0 :(得分:0)

您正在ArrayAdapter传递自定义布局。在这里,您应该传递要在其上显示文本的textview的资源ID。这就是为什么它会给出这个错误。

只需以这种方式调用适配器。

listview = (ListView) findViewById(R.id.listview);
        adapter = new ArrayAdapter<String>(MainActivity.this,
                R.layout.activity_main,R.id.tvname );

此处R.id.tvnameactivity_main.xml中某个textview的ID。或者您可以创建自定义适配器。

答案 1 :(得分:0)

查看ArrayAdapter

的构造函数
  

public ArrayAdapter(Context context,int resource)

     

在API级别1构造函数

中添加      

参数context当前上下文。 resource a的资源ID   布局文件,包含在实例化视图时使用的TextView。

检查来源

http://androidxref.com/4.4.2_r2/xref/frameworks/base/core/java/android/widget/ArrayAdapter.java

查看第387行,这正是堆栈跟踪所说的。您可以查看createViewFromResource并了解会发生什么

您需要的是仅包含TextView的xml

row.xml

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

/>

然后

adapter = new ArrayAdapter<String>(MainActivity.this,
            R.layout.row);

您也可以拥有自定义适配器并自定义textview

同时检查此

"ArrayAdapter requires the resource ID to be a TextView" xml problems