ArrayAdapter requires ID to be a TextView error

两盒软妹~` 提交于 2019-12-28 07:02:14

问题


I am trying to create a nice layout for my list items, but my code only works when it is simplified like this:

<?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="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>

When I add a little bit more it compiles and runs but it force closes on start and gives me the error ArrayAdapter requires ID to be a TextView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" >

    <ImageView
        android:id="@+id/icon1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@id/icon1"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:text="Some more information" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/secondLine"
        android:layout_alignParentTop="true"
        android:layout_alignWithParentIfMissing="true"
        android:layout_toRightOf="@id/icon1"
        android:gravity="center_vertical"
        android:text="Some Information" />

    <ImageView
        android:id="@+id/icon2"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

and

public class FirstLoginActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] testcontacts = getResources().getStringArray(
                R.array.testcontacts_array);
        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_items,
                testcontacts));

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new 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();
            }
        });
    }

I am pretty sure I'm doing this right, I've been through numerous tutorials and I've found that the fastest and most efficient way is to create a static ViewHolder class. One of the tutorials tried accessing the data directly which is what I was trying to do. I'm still a little confused on how to do so.

    public class FirstLoginActivity extends ListActivity {
    Context mContext;
    List mList;

    String[] testcontacts = getResources().getStringArray(
            R.array.testcontacts_array);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_items,
                testcontacts));

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new 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();
            }
        });
    }



    public View getView(int position, View convertview, ViewGroup parent) {
        ViewHolder holder;
        View v = convertview;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) LayoutInflater
                    .from(mContext);
            v = inflater.inflate(R.layout.list_items, null);
            holder = new ViewHolder();
            holder.firstLine = (TextView) v.findViewById(R.id.firstLine);
            holder.secondLine = (TextView) v.findViewById(R.id.secondLine);
            holder.icon1 = (ImageView) v.findViewById(R.id.icon1);
            holder.icon2 = (ImageView) v.findViewById(R.id.icon2);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
        holder.firstLine.setText(testcontacts[position]);
        holder.secondLine.setText(testcontacts[position]);
        // holder.icon1.setImageBitmap((position & 1) == 1 ? mIcon1: mIcon2);
        //call the images directly?
        return v;
    }

    static class ViewHolder {
        TextView firstLine;
        TextView secondLine;
        ImageView icon1;
        ImageView icon2;

    }
}

回答1:


You are probably using something like this (here the doc):

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.layout_1, values);

in that case your layout must be a simple layout with a TextView.

If you wanna use your own layout you need to write a custom adapter.




回答2:


Build your own ArrayAdapter, then you can make the layout work however you would like.




回答3:


The ArrayAdapter requires the resource ID to be a TextView XML exception means you don't supply what the ArrayAdapter expects. When you use this constructor:

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

R.Layout.a_layout_file must be the id of a xml layout file containing only a TextView(the TextView can't be wrapped by another layout, like a LinearLayout, RelativeLayout etc!), something like this:

<?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
/>

If you want your list row layout to be something a little different then a simple TextView widget use this constructor:

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

where you supply the id of a layout that can contain various views, but also must contain a TextView with and id(the third parameter) that you pass to your ArrayAdapter so it can know where to put the Strings in the row layout.




回答4:


You seem to be on the right lines. I'm not sure the exact issue with your code as I've not compared closely, but it works in this example.

The full tutorial is here: Android tutorial for beginners - 97 - ListView with Custom Layout

This avoids the error ArrayAdapter requires ID to be a TextView which I was also getting.



来源:https://stackoverflow.com/questions/8673829/arrayadapter-requires-id-to-be-a-textview-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!