[英]add data to ListView in a class which extends Activity and not ListActivity
我在相對布局中有一個Listview。 我該如何從擴展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;
}
}
要將數據添加到列表視圖中,您需要將數據添加到數據集,然后通過調用適配器adapter.notifyDataSetChanged()
告知適配器數據集已更改。 因此,要使列表正常工作,您需要數據集(即Array)listview(在布局中)和綁定這兩個togeter的適配器(即ArrayAdapter
)。 您還需要通過調用list.setAdapter()
來告訴list它的適配器在哪里。 ListActivity
只是一個幫助器類,不是ListActivity
,沒有它,ListView可以很好地工作。
或者,您可以通過已設置的適配器來管理數據,方法是使用adapter.add(item)
等將數據直接添加到適配器中或從適配器中刪除數據。用於創建適配器的基礎列表(如果您使用過的)將更新為,您無需擔心通知。 如果將任何觀察者添加到適配器,則notifyDataSetChanged()
更有意義。
編輯:
即時通訊無法評論您的帖子,之后您編輯了示例代碼。 因為您嘗試從AsyncTask更新列表(據我從stacktrace看到的),所以您必須調用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)
這里是一個例子:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.