自定义ListView不会显示在活动中

时间:2015-07-08 10:52:45

标签: java android listview android-studio

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

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

运行应用程序时没有错误,但列表视图不会在活动中显示。我期望输出是单行的" Hiiiii"在里面。我做错了什么?

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");
        }

    }

3 个答案:

答案 0 :(得分: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);

        }

答案 1 :(得分:0)

你的清单是空的,这就是它没有显示任何内容的原因。你可以通过两种可能的方式处理这个问题。

  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. 如果您不了解列表的内容和大小,特别是当您从通过互联网或数据库从某些资源获取的数据填充列表时,那么您可以使用

    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();
    

答案 2 :(得分:0)

更改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”。