0

相対レイアウトのリストビューがあります。Activity を拡張する ManActivity から 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;
    }
}
4

3 に答える 3

0

marcinsの回答に代わる方法として、アダプターに直接データを追加/アダプターから直接データを追加/削除することにより、既に設定したアダプターを介してデータを管理できますadapter.add(item)。アダプターを作成するために使用した基本リスト(使用した場合)はに更新され、通知について心配する必要はありません。notifyDataSetChanged()アダプターにオブザーバーを追加すると、より理にかなっています。

編集:

あなたの投稿にコメントすることができず、後でサンプルコードを編集しました。AsyncTask からリストを更新しようとするため (スタックトレースから見る限り)、呼び出す必要があります。runOnUiThread(Runnable r)

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.add(new Message(1, "Hello World3", "Thank You3"));
    }
});

編集2:

これらの値はすでに拡張された arrayadapter のメンバーであるため、アダプター内に値のメンバーを持つ必要はありません。の特定のメッセージにアクセスするには、getViewを呼び出すことができますgetItem(position)。そうすれば、あなたのを上書きする必要はありませんlistAdapter.add(T item)

于 2013-07-07T20:14:08.733 に答える
0

リストビューにデータを追加するには、データセットにデータを追加してから、前述のように呼び出してアダプター データセットが変更されたことを伝える必要がありますadapter.notifyDataSetChanged()。したがって、リストを機能させるには、データセット(つまり配列)リストビュー(レイアウト内)とこれら2つをバインドするアダプター(つまりArrayAdapter)が必要です。また、 を呼び出して、アダプタがどこにあるかを list に伝える必要がありますlist.setAdapter()ListActivityは単なるヘルパー クラスであり、要件ではなく、ListView はそれがなくても完全に正常に動作します。

于 2013-07-07T20:02:34.043 に答える
0

ここに例があります:

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);
于 2013-07-07T20:19:48.553 に答える