混淆Textview和Listview以显示列表

时间:2017-01-04 15:20:16

标签: android listview android-arrayadapter

我尝试了一些不同的布局来深入了解可能性和差异。 我从一个数组开始,在listview中显示工作正常的项目。

现在我想通过JSON显示我从数据库中获取的项目。

我收到以下错误:您必须为TextView提供资源ID

我使用了之前有效的XML文件,这里是我的all_products.xml

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">

    <ListView
        android:id="@+id/mobile_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/colorPrimaryDark"
        android:dividerHeight="1px">
    </ListView>

</LinearLayout>

在我的java类中,我使用了之前用于数组适配器的代码,我只更改了应该显示的参数。这是AllProductsActivity.java的一部分:

 private void processValue(ArrayList<String> result) {
    {
        ArrayAdapter adapter = new ArrayAdapter<String>(AllProductsActivity.this, R.layout.all_products, result);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
    }
}

结果来自我的asynctask。这里也是一个片段:

JSONArray jsonArray = new JSONArray(result.toString())
ArrayList<String> listdata = new ArrayList<String>();
for(int n = 0; n < jsonArray.length(); n++)
{
    JSONObject object = jsonArray.getJSONObject(n);
    listdata.add(object.optString("nr"));
}
return listdata;
 protected void onPostExecute( ArrayList<String> result) {      
     pdLoading.dismiss();
     processValue(result);
 }

为什么我收到错误?也许只使用Textview怎么样?在我搜索toppic时,我发现人们使用Textview而不是Listview的不同威胁。 编辑:所以它的工作原理我添加了另一个xml文件mytextview.xml

<TextView android:id="@+id/mytext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/colorPrimaryDark"
android:dividerHeight="1px"
xmlns:android="http://schemas.android.com/apk/res/android">

并将适配器更改为以下内容:

            ArrayAdapter adapter = new ArrayAdapter<String>(AllProductsActivity.this,
                R.layout.mytextview,R.id.mytext  , result);
        ListView listView = (ListView) findViewById(R.id.mobile_list);
        listView.setAdapter(adapter);

3 个答案:

答案 0 :(得分:3)

当您使用自定义布局R.layout.all_products时,适配器不知道从数据列表设置数据的视图

所以,您需要告诉适配器,文本视图的ID以设置数据。

 ArrayAdapter adapter = new ArrayAdapter<String>
                     (AllProductsActivity.this,
                      R.layout.all_products,R.id.your_text_view_id, result);
//                                               ^^^^^^^^^ pass the text view ID

ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

如果您只想显示没有任何自定义布局的数据,那么可以在构建android资源布局中使用

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,result);

答案 1 :(得分:1)

在Pavneet的第一个解决方案中,请注意:

资源:是包含textView的资源,而不是包含列表本身的xml文件(不是R.layout.all_products)

textViewResourceId :资源中包含的textView的ID

答案 2 :(得分:-1)

在实例化TextView时,您提供的ID必须来自仅包含You must supply a resource ID for a TextView的布局。这就是错误private void shareOrViewUrlViaThisApp(String appPackageName, String url) { boolean found = false; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0); if (!resInfo.isEmpty()){ for (ResolveInfo info : resInfo) { if (info.activityInfo.packageName.toLowerCase().contains(appPackageName) || info.activityInfo.name.toLowerCase().contains(appPackageName) ) { intent.setPackage(info.activityInfo.packageName); found = true; break; } } if (!found) return; startActivity(Intent.createChooser(intent, "Select")); } } 的含义