【问题标题】:Custom ListView won't show up in the Activity自定义 ListView 不会显示在 Activity 中
【发布时间】:2015-09-26 05:42:52
【问题描述】:

我正在尝试在 Android Studio 中创建一个具有自定义行布局和适配器的 ListView。我关注了this tutorial,但尝试了一个更简单的版本来熟悉它。我不会从 JSON 格式的数据中填充 ListView 中的数据,也不会使用任何图像加载器,我只是尝试使用类似的格式,但手动设置字符串的内容。

我创建了一个row.xml,只有一个简单的文本字段“名称”。然后创建了一个简单的 ListModel 来为字符串名称创建 get 和 set 方法。然后尝试创建并使用带有 ListModel 的自定义适配器将内容放置在 ListViewActivity 中。最后,在 ListViewActivity 中我尝试定义字符串名称的内容并将其显示在视图中。

运行应用程序时没有错误,但列表视图不会显示在活动中。我希望输出是带有“Hiiii” init 的单行。我做错了什么?

list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background2"
    android:id="@+id/listviewactivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/challengeslistView"
        android:choiceMode="singleChoice" />
</RelativeLayout>

row.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="17sp"
        android:textColor="#000000"
        />

ListModel.java

    public class ListModel {

        private  String Name="";

        public ListModel() {

        }

        public ListModel(String name) {
            this.Name = name;


        }

        /*********** Set Methods ******************/

        public void setName(String Name)
        {
            this.Name = Name;
        }



        /*********** Get Methods ****************/

        public String getName()
        {
            return this.Name;
        }

    }

CustomListAdapter.java

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; 
import java.util.List;

public class CustomListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<ListModel> items;


    public CustomListAdapter(Activity activity, List<ListModel> items) {
        this.activity = activity;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int location) {
        return items.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null)
            convertView = inflater.inflate(R.layout.row, null);

        TextView name = (TextView) convertView.findViewById(R.id.name);

        convertView.setBackgroundResource(R.drawable.testimage);

        ListModel m = items.get(position);

        // title
        name.setText(m.getName());

        return convertView;
    }
}

ListViewActivity.java

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

    public class ListViewActivityextends Activity {

        private List<ListModel> list = new ArrayList<ListModel>();
        private ListView listView;
        private CustomListAdapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.challenges_view);
            Intent intent = getIntent();

            listView = (ListView) findViewById(R.id.list_view);
            adapter = new CustomListAdapter(this, list);
            listView.setAdapter(adapter);

            ListModel listmodel = new ListModel();
            listmodel.setName("Hiiiiii");
        }

    }

【问题讨论】:

标签: java android listview android-studio


【解决方案1】:
private List<ListModel> list = new ArrayList<ListModel>();

您的列表对象的大小为零。我还没有看到任何数据初始化

listView = (ListView) findViewById(R.id.list_view);
            adapter = new CustomListAdapter(this, list);
            listView.setAdapter(adapter);

在您的适配器中 getCount 方法将返回其大小,在您的情况下它将为零。请检查

您应该使用您的数据初始化该列表。或像这样更改代码

@Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.list_view);
            Intent intent = getIntent();

            //create your model data
            ListModel listmodel = new ListModel();
            listmodel.setName("Hiiiiii");

            //add your model to the collection
            list.add(listmodel);

            //then you can set your adapter
            listView = (ListView) findViewById(R.id.list_view);
            adapter = new CustomListAdapter(this, list);
            listView.setAdapter(adapter);

        }

【讨论】:

  • 我的错我应该注意到这一点。非常感谢
【解决方案2】:

修改onCreate方法中的代码如下图: 原因是您传递给适配器的列表中的数据为 0。

  @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.challenges_view);
        Intent intent = getIntent();

        ListModel listmodel = new ListModel();
        listmodel.setName("Hiiiiii");
        list.add(listmodel);
        listView = (ListView) findViewById(R.id.list_view);
        adapter = new CustomListAdapter(this, list);
        listView.setAdapter(adapter);


    }

现在这将在列表中显示一个项目“Hiiiiii”。

【讨论】:

    【解决方案3】:

    您的列表是空的,这就是它没有显示任何内容的原因。您可以通过两种可能的方式处理此问题。

    1. 如果您知道您的数组列表是固定大小并且不会更新,那么您可以先填充您的列表,然后设置适配器...

          listView = (ListView) findViewById(R.id.list_view);
          ListModel listmodel = new ListModel();
          listmodel.setName("Hiiiiii");
      
          // populate your list
          list.add(listmodel);
      
          //now set the adapter..
           adapter = new CustomListAdapter(this, list);
          listView.setAdapter(adapter);
      
    2. 如果您不知道列表的内容和大小,尤其是当您从通过 Internet 或数据库从某些资源获取的数据中填充列表时。那么您可以使用

      list.add(listmodel); adapter.notifyDataSetChanged();

      代码会是这样的

          listView = (ListView) findViewById(R.id.list_view);
          adapter = new CustomListAdapter(this, list);
          listView.setAdapter(adapter);
          ListModel listmodel = new ListModel();
          listmodel.setName("Hiiiiii");`
          list.add(listmodel);
          adapter.notifyDataSetChanged();
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多