Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在扩展活动而不是ListActivity的类中向ListView添加数据_Java_Android_Listview - Fatal编程技术网

Java 在扩展活动而不是ListActivity的类中向ListView添加数据

Java 在扩展活动而不是ListActivity的类中向ListView添加数据,java,android,listview,Java,Android,Listview,我有一个相对布局的列表视图。如何从扩展活动的管理活动向ListView添加数据。如果我使用了扩展ListActivity的类,我可能会使用adapter.notifyDataSetChanged()。。。。我想是吧。有什么建议吗?提前谢谢 Message msg[] = new Message[] { new Message(1, "Hello World", "Thank You"), new Message(1, "He

我有一个相对布局的列表视图。如何从扩展活动的管理活动向ListView添加数据。如果我使用了扩展ListActivity的类,我可能会使用adapter.notifyDataSetChanged()。。。。我想是吧。有什么建议吗?提前谢谢

Message msg[] = new Message[]
                {
                    new Message(1, "Hello World", "Thank You"), new Message(1, "Hello World 2", "Thank You 2")
                };
adapter = new MyAdapter(context, R.layout.row, msg);
listview.setAdapter(adapter);
添加此项将使我的应用程序崩溃

adapter.add(new Message(1, "Hello World3", "Thank You3"));
Logcat文本

07-07 20:22:53.680: E/AndroidRuntime(1512): FATAL EXCEPTION: AsyncTask #3
07-07 20:22:53.680: E/AndroidRuntime(1512): java.lang.RuntimeException: An error occured while executing doInBackground()
07-07 20:22:53.680: E/AndroidRuntime(1512):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.lang.Thread.run(Thread.java:856)
07-07 20:22:53.680: E/AndroidRuntime(1512): Caused by: java.lang.UnsupportedOperationException
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.AbstractList.add(AbstractList.java:404)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.AbstractList.add(AbstractList.java:425)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at com.abhishek.ally2.chat.doInBackground(chat.java:28)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at com.abhishek.ally2.chat.doInBackground(chat.java:1)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-07 20:22:53.680: E/AndroidRuntime(1512):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-07 20:22:53.680: E/AndroidRuntime(1512):     ... 4 more
MyAdapter.java

package com.abhishek.ally2;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<Message>{
    private final Context context;
    private final Message data[];
    int layoutResourceId;

    public MyAdapter(Context context, int layoutResourceId, Message[] values) {
        // TODO Auto-generated constructor stub
        super(context, layoutResourceId, values);
        this.context = context;
        this.data = values;
        this.layoutResourceId = layoutResourceId;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        MessageHolder holder = null;
        if(row == null)
        {
            LayoutInflater inflator = ((Activity)context).getLayoutInflater();
            row = inflator.inflate(layoutResourceId, parent, false);
            holder = new MessageHolder();
            holder.pic = (ImageView)row.findViewById(R.id.pic);
            holder.msg = (TextView)row.findViewById(R.id.msg);
            holder.time = (TextView)row.findViewById(R.id.time);
            row.setTag(holder);

        }
        else
        {
            holder = (MessageHolder)row.getTag();
        }
            Message message = data[position];
            holder.msg.setText(message.msg);
            holder.time.setText(message.time);

        return row;

    }


    static class MessageHolder {
        ImageView pic;
        TextView msg;
        TextView time;
    }
}
package com.abhishek.ally2;
导入android.app.Activity;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MyAdapter扩展了ArrayAdapter{
私人最终语境;
专用最终消息数据[];
国际布局资源;
公共MyAdapter(上下文上下文、int-layoutResourceId、消息[]值){
//TODO自动生成的构造函数存根
超级(上下文、布局资源ID、值);
this.context=上下文;
这个数据=数值;
this.layoutResourceId=layoutResourceId;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
MessageHolder=null;
if(行==null)
{
LayoutFlater充气器=((活动)上下文)。GetLayoutFlater();
行=充气机。充气(布局资源ID,父项,false);
holder=新的MessageHolder();
holder.pic=(ImageView)row.findViewById(R.id.pic);
holder.msg=(TextView)row.findViewById(R.id.msg);
holder.time=(TextView)row.findViewById(R.id.time);
row.setTag(支架);
}
其他的
{
holder=(MessageHolder)行。getTag();
}
消息=数据[位置];
holder.msg.setText(message.msg);
holder.time.setText(message.time);
返回行;
}
静态类消息持有者{
图像视图;
文本视图消息;
文本查看时间;
}
}

要将数据添加到listview,您需要将数据添加到数据集,然后通过调用您提到的
adapter.notifyDataSetChanged()
告诉适配器数据集已更改。因此,要使列表工作,您需要数据集(即数组)列表视图(在布局中)和将这两个绑定到一起的适配器(即
ArrayAdapter
)。您还需要通过调用
list.setAdapter()
来告诉list它的适配器在哪里
ListActivity
只是一个助手类,不是一个要求,没有它ListView工作得非常好

与marcins的回答不同,您可以通过已设置的适配器管理数据,方法是使用
adapter.add(item)
等将数据直接添加到适配器或从适配器中删除数据。用于创建适配器(如果您使用了适配器)的基础列表将更新为,您无需担心通知<如果向适配器添加任何观察者,则代码>notifyDataSetChanged()更有意义

编辑:

我不能评论你的文章,你后来编辑了你的示例代码。由于您试图从AsyncTask更新列表(据我从stacktrace看到的),因此必须调用
rununuithread(Runnable r)

Edit2:

适配器中的值不需要有成员,因为这些值已经是扩展arrayadapter的成员。要访问
getView
中的一条特定消息,可以调用
getItem(position)
。这样,您就不需要覆盖列表适配器。添加(t项)

以下是一个示例:

Years years = readYearsList(); // return the Years array.

ListView listYears = (ListView)findViewById(R.id.list);
YearAdapter yearAdapter = new YearAdapter(MainActivity.this, R.layout.rowyears, years); // YearAdapter extends ArrayAdapter<Years>
listYears.setAdapter(yearAdapter);
Years-Years=readYearsList();//返回年份数组。
ListView listYears=(ListView)findViewById(R.id.list);
YearAdapter YearAdapter=新的YearAdapter(MainActivity.this,R.layout.rowyears,years);//年适配器扩展阵列适配器
listYears.setAdapter(yearAdapter);

是否使用适配器与是否扩展ListActivity无关<代码>myListView.setAdapter(适配器)。那你的问题是什么?我已经用过这个。。。现在我想添加更多数据。。。类似myListView.addToExistingData()的内容。。。明白我想说的吗我不确定问题出在哪里,但你可以看看,试着模仿它的部分或全部行为。啊,我明白你的困惑。您可以将数据添加到适配器,或者更确切地说,添加到它绑定到的数据源,而不是ListView。ListView只负责适配器呈现给它的任何视图,适配器从绑定到的数据集生成这些视图。@Simon我添加了一些代码。请看一看。。。
Years years = readYearsList(); // return the Years array.

ListView listYears = (ListView)findViewById(R.id.list);
YearAdapter yearAdapter = new YearAdapter(MainActivity.this, R.layout.rowyears, years); // YearAdapter extends ArrayAdapter<Years>
listYears.setAdapter(yearAdapter);