How to fix this ArrayAdapter requires the resource ID to be a TextView

半城伤御伤魂 提交于 2020-01-30 13:13:10

问题


I am new to android, I'm trying to develop an application with gridview and listview using json. Through json I displayed set of images in gridview and based on the position of the gridview, i am displaying the results in the next page which is listview. This is my Sub_Category.java (2nd page java file)

package com.javatechig.gridviewexample;
public class Sub_Categories extends ActionBarActivity {
private ArrayList<GridItem> SubCatgyData;
private static final String TAG = Sub_Categories.class.getSimpleName();
public String TAG1 = "Value for ID";
public String TAG2 = "Value for subCategory";
public String TAG4 = "Value for subCategory in main method";
public String TAG3 = "DONE";
public String categoryID;
private ProgressBar mProgressBar;
private ListView listView;
public String subURL = "http://www.prateektechnosoft.com/justcall/cities/gridsubcategories/chennai/";
public String URLwithID;
private ListAdapter mListAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub__categories);
    categoryID = getIntent().getStringExtra("ID");
    Log.e(TAG1, categoryID);
    SubCatgyData = new ArrayList<>();
    URLwithID = subURL + categoryID;

    mProgressBar = (ProgressBar) findViewById(R.id.progressBar2);
    Log.e(TAG3, "Before Execute");
    new AsyncHttpTask().execute(URLwithID);
    Log.d(TAG4, String.valueOf(SubCatgyData.size()));
    Log.e(TAG3, "After Execute");
    mProgressBar.setVisibility(View.VISIBLE);


    listView=(ListView) findViewById(R.id.listView2);


    ArrayAdapter adapter = new ArrayAdapter(Sub_Categories.this,android.R.layout.simple_list_item_2,SubCatgyData);
    listView.setAdapter(adapter);


}

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        try {
            // Create Apache HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse httpResponse = httpclient.execute(new HttpGet(params[0]));
            int statusCode = httpResponse.getStatusLine().getStatusCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                String response = streamToString(httpResponse.getEntity().getContent());
                parseResult(response);
                result = 1; // Successful
            } else {
                result = 0; //"Failed
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        runOnUiThread(new Runnable() {
            public void run() {
                listView = (ListView) findViewById(R.id.listView2);


                ArrayAdapter adapter = new ArrayAdapter(Sub_Categories.this, android.R.layout.list_content, SubCatgyData);
                listView.setAdapter(adapter);

            }
        });

        Log.e(TAG3, "Done in do background methid");
        return result;
    }

            @Override
    protected void onPostExecute(Integer result) {
        // Download complete. Lets update UI

        if (result == 0) {

            Toast.makeText(Sub_Categories.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
        }


        //Hide progressbar
        mProgressBar.setVisibility(View.GONE);
        Log.e(TAG3, "Done in onPostExecute methid");
    }

   }
    String streamToString(InputStream stream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
        String line;
        String result = "";
        while ((line = bufferedReader.readLine()) != null) {
            result += line;
        }

        // Close stream
        if (null != stream) {
            stream.close();
        }
        Log.e(TAG3, "Done in streamTOString methid");
        return result;
    }

    private void parseResult(String result) {
        try {
            //JSONObject response = new JSONObject(result);
            JSONArray posts = new JSONArray(result);
            GridItem item;
            for (int i = 0; i < posts.length(); i++) {
                JSONObject post = posts.optJSONObject(i);
                String catid = post.optString("suB_CATEGORYNAME");
                item = new GridItem();
                item.setID(catid);
                SubCatgyData.add(item);
            }


            Log.d(TAG2, String.valueOf(SubCatgyData.size()));

        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.e(TAG3, "Done in parseResult methid");
        return;
    }
}

This is my Layout file.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.javatechig.gridviewexample.Sub_Categories">

<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/listView2"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />
<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar2"
    android:layout_centerInParent="true"
    android:visibility="gone"/>

</RelativeLayout>

This is my LOG. I can't fix this error. Please help me.

12-15 11:44:33.528 25575-25575/com.javatechig.gridviewexample E/ArrayAdapter: You must supply a resource ID for a TextView
12-15 11:44:33.528 25575-25575/com.javatechig.gridviewexample D/AndroidRuntime: Shutting down VM
12-15 11:44:33.529 25575-25575/com.javatechig.gridviewexample E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.javatechig.gridviewexample, PID: 25575
                                                                            java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
                                                                                at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:393)
                                                                                at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
                                                                                at android.widget.AbsListView.obtainView(AbsListView.java:2346)
                                                                                at android.widget.ListView.measureHeightOfChildren(ListView.java:1280)
                                                                                at android.widget.ListView.onMeasure(ListView.java:1188)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                                at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                                at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                                at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
                                                                                at android.view.View.measure(View.java:18788)
                                                                                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
                                                                                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
                                                                                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
                                                                                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                                                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
                                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                                at android.view.Choreographer.doFrame(Choreographer.java:606)
                                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                             Caused by: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.widget.TextView
                                                                                at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
                                                                                at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) 
                                                                                at android.widget.AbsListView.obtainView(AbsListView.java:2346) 
                                                                                at android.widget.ListView.measureHeightOfChildren(ListView.java:1280) 
                                                                                at android.widget.ListView.onMeasure(ListView.java:1188) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) 
                                                                                at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                                                                                at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
                                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
                                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                                                                                at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
                                                                                at android.view.View.measure(View.java:18788) 
                                                                                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
                                                                                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
                                                                                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
                                                                                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
                                                                                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
                                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                                                                                at android.view.Choreographer.doFrame(Choreographer.java:606) 
                                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                                                                                at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                at android.os.Looper.loop(Looper.java:148) 
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Thanks in advance


回答1:


Since you are using the default ListView and ArrayAdapter, and you have only one data list, ie SubCatgyData, you should be using android.R.layout.simple_list_item_1 instead of android.R.layout.simple_list_item_2.

The difference between the two is android.R.layout.simple_list_item_1 has only one TextView inside it, while android.R.layout.simple_list_item_2 has two TextView.

ArrayAdapter adapter = new ArrayAdapter(Sub_Categories.this,android.R.layout.simple_list_item_1,SubCatgyData);



回答2:


You need to override [ArrayAdapter.getView(int, View, ViewGroup)](http://developer.android.com/reference/android/widget/ArrayAdapter.html#getView(int, android.view.View, android.view.ViewGroup)). See http://developer.android.com/reference/android/widget/ArrayAdapter.html

To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, override getView(int, View, ViewGroup) to return the type of view you want.




回答3:


Create your custom layout for adapter. You are using one provided by android. See the android prefix you are using for your layout.



来源:https://stackoverflow.com/questions/34282301/how-to-fix-this-arrayadapter-requires-the-resource-id-to-be-a-textview

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