列表视图在android中不起作用

Posted

技术标签:

【中文标题】列表视图在android中不起作用【英文标题】:List view not working in android 【发布时间】:2015-10-19 14:06:45 【问题描述】:

我正在尝试为我的大学项目制作一个通知应用程序。

我正在尝试为 listview 创建自定义适配器,但包含 ListView 的活动没有显示任何内容。我想我在 CustomAdapter.java 的 getView() 方法中做错了。

CustomAdapter 类用于为列表视图创建子视图。 listviechild.xml 定义了 listview titth xml 文件中单行的布局 - listactivity.xml

    package com.example.client_nic;

    import java.util.ArrayList;

    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    import android.widget.Toast;

    public class CustomAdapter extends BaseAdapter 
        public Context context =null;
        public ArrayList<String> nam = null;
        public ArrayList<String> date= null;
        public ArrayList<String> time = null;
        LayoutInflater inflater =null;

        public CustomAdapter(Context context, ArrayList<String> nam,
                ArrayList<String> date, ArrayList<String> time) 
            super();
            nam = new ArrayList<String>();
            date = new ArrayList<String>();
            time = new ArrayList<String>();

            this.context = context;
            this.nam = nam;
            this.date = date;
            this.time = time;

            inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        

        @Override
        public int getCount() 
            // TODO Auto-generated method stub
            return nam.size();
        

        @Override
        public Object getItem(int arg0) 
            // TODO Auto-generated method stub
            return arg0;
        

        @Override
        public long getItemId(int arg0) 
            // TODO Auto-generated method stub
            return arg0;
        

        @Override
        public View getView(int pos, View view, ViewGroup arg2) 

            // TODO Auto-generated method stub
            Log.e("name",nam.get(pos));
            Log.e("date",date.get(pos));
            Log.e("time", time.get(pos));

            view = inflater.inflate(R.layout.listviewchild, arg2,false);
            if(view.isActivated())
                Toast.makeText(context, "yes",Toast.LENGTH_SHORT).show();
            

            TextView nametv = (TextView)view.findViewById(R.id.textView1);
            TextView datetv = (TextView)view.findViewById(R.id.textView2);
            TextView timetv = (TextView)view.findViewById(R.id.textView3);

            nametv.setText(nam.get(pos));
            datetv.setText(date.get(pos));
            timetv.setText(time.get(pos));
            return view;
        

    






listviewchild.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    >

  <TextView
      android:id="@+id/textView1"
      android:layout_
      android:layout_
      android: />
  <TextView android:id="@+id/textView2"
      android:layout_
      android:layout_
      android:
      android:layout_below="@+id/textView1"
      />
  <TextView android:id="@+id/textView3"
      android:layout_
      android:layout_
      android:
      android:layout_marginLeft="30dp"
      android:layout_toRightOf="@+id/textView2"
      android:layout_below="@+id/textView1"

      />

</RelativeLayout>

listactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >
<ListView android:id="@+id/list"
    android:layout_
    android:layout_>

</ListView>    

</LinearLayout>

【问题讨论】:

链接使用此适配器的活动并附加到列表视图。我怀疑缺少 setAdapter 调用或传递了空数据。 【参考方案1】:

尝试以下方法:

包 com.example.client_nic;

import java.util.ArrayList;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class CustomAdapter extends BaseAdapter 
    public Context context =null;
    public ArrayList<String> nam = null;
    public ArrayList<String> date = null;
    public ArrayList<String> time = null;
    LayoutInflater inflater = null;

    public CustomAdapter(Context context, ArrayList<String> nam,
            ArrayList<String> date, ArrayList<String> time) 
        nam = new ArrayList<String>();
        date = new ArrayList<String>();
        time = new ArrayList<String>();

        this.context = context;
        this.nam = nam;
        this.date = date;
        this.time = time;

        inflater = LayoutInflater.from(context);

    

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        return nam.size();
    

    @Override
    public Object getItem(int arg0) 
        // TODO Auto-generated method stub
        return arg0;
    

    @Override
    public long getItemId(int arg0) 
        // TODO Auto-generated method stub
        return arg0;
    

    @Override
    public View getView(int pos, View view, ViewGroup arg2) 

        // TODO Auto-generated method stub
        Log.e("name",nam.get(pos));
        Log.e("date",date.get(pos));
        Log.e("time", time.get(pos));

        view = inflater.inflate(R.layout.listviewchild, arg2, false);
        if(view.isActivated())
            Toast.makeText(context, "yes",Toast.LENGTH_SHORT).show();
        

        TextView nametv = (TextView)view.findViewById(R.id.textView1);
        TextView datetv = (TextView)view.findViewById(R.id.textView2);
        TextView timetv = (TextView)view.findViewById(R.id.textView3);

        nametv.setText(nam.get(pos));
        datetv.setText(date.get(pos));
        timetv.setText(time.get(pos));
        return view;
    


这应该会适当地夸大您的观点和工作。如果还有其他问题,您可能会将空数据传递给适配器。

附注

1) 您正在传递三个 ArrayList 来填充 ListView 的数据。为什么不只传递一个带有自定义 Java 对象的数组列表呢? java 对象的字段是名称、数据、时间。

即:

public class MyObject
    public String name;
    public String date;
    public String time;

    MyObject(String name, String date, String time)
        this.name = name;
        this.date = date;
        this.time = time;
    

    //define getters and setters...

和:

 public CustomAdapter(Context context, ArrayList<MyObject> objs) 
     ...
     ...
 

2) 你每次都在膨胀视图。相反,使用ViewHolder Pattern 来保存视图数据,而不是每次在应用程序中重新绘制并查找资源。 Android 利用回收视图,因此您希望最大限度地利用这一点并节省资源并减少每次加载视图的延迟(大量开销!)。我不会为您提供这方面的示例,但请查看该链接以了解如何自己执行此操作!

【讨论】:

请问您为什么不将 ViewGroup 传递给 LayoutInflater?我知道调用inflate(R.resource, null) 等于inflate(R.resource, null, false),但是查看inflate 方法的源,它需要ViewGroup 来获取父布局参数,否则它将从属性集中创建生成的参数。我在 Android 上有点生疏,但创建的视图将与手机尺寸的父级匹配,对吧? LayoutInflater.from(context).inflate(id, null) 将导致高度换行,宽度与父级匹配,所以实际上我们可能不希望这样。相反,我们应该使用 LayoutInflater.from(context).inflate(id, parent, false);这实际上从 id 下定义的布局中获取布局参数并将其应用于高度和宽度。在编辑中修复。只需要在充气机的实例化中进行更改 有趣的是,现在的代码与 OP 的代码是一样的,只是获得充气机的方式更好。 (基本上与 OP 相同,但更易于阅读,再次查找源代码:P)。但是,您的额外笔记非常有帮助!我想知道这段代码是否可以解决 OP 遇到的问题。 应该可以(我以前做过!).. 唯一的问题是不正确使用未设置的适配器(即 setAdapter)或传递的空数据 我同意你的看法,并且想知道 OP 是否甚至将适配器附加到 ListView,这是一个非常愚蠢的错误,但它确实发生了(我可以在那里提供一些我自己的经验 xD) 【参考方案2】:

通过查看您的代码,我认为类 CustomAdapter (ArrayList s) nam、date 和 time 的实例变量没有被传递给构造函数的相应 ArrayList 的内容填充,因此包含 ListView 的 Activity 正在显示没有。 将构造函数替换为以下代码

public CustomAdapter(Context context, ArrayList<String> nam,
            ArrayList<String> date, ArrayList<String> time) 
        super();

        this.context = context;
        this.nam.addAll(nam);
        this.date.addAll(date); 
        this.time.addAll(time);

        inflater =LayoutInflater.from(context);

    

我想这会解决你的问题。

【讨论】:

以上是关于列表视图在android中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

可扩展列表视图在 android 的片段活动中不起作用

OnItemCLickListener 在列表视图中不起作用

listView.setOnItemClickListener() 在 Android 中不起作用

为啥自动完成在列表视图中不起作用

下拉列表在 asp.net 的移动视图中不起作用

Onclicklistener 在片段列表视图中不起作用