快速问题,我希望在与生成任务不同的活动中更新Async任务中的列表视图。我的问题是关于在其他活动中更新适配器,我将如何访问其他活动适配器,以便我可以添加到它(使用adapter.add(item);)并通知适配器更改以更新列表另一个活动(adapter.notifyChange();)?
这是连接任务:
公共类ConnectionTask扩展了AsyncTask< Context,String,Void> {
private String mText;
private Context mContext;
private int NOTIFICATION_ID = 1;
private Notification mNotification;
private NotificationManager mNotificationManager;
@SuppressWarnings("unused")
private NotificationActivity noteact = new NotificationActivity();
public ConnectionTask(Context context){
this.mContext = context;
//Get the notification manager
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
@Override
protected void onPreExecute() {
Log.i("PushNote", "onPreExecute");
}
public void setmText(String mText){
this.mText = mText;
}
public String getmText(){
return mText;
}
@Override
protected Void doInBackground(Context... params) {
Socket clientSocket = null;
//Creates the is connected boolean and sets it to false
boolean connected = false;
String ipaddr = getmText();
// define a writer and a reader, so that we can interact with the
// Server
BufferedReader inFromServer = null;
InetAddress addr = null;
try {
addr = InetAddress.getByName(ipaddr);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
publishProgress(e1.toString());
e1.printStackTrace();
}
// Dynamically find IP of current Localhost
String HostName = addr.getHostName();
int port = 6789;
try {
// Lets try and instantiate our client and define a port number.
clientSocket = new Socket(HostName, port);
// once the client is connected sets the isConnected boolean to true
connected = true;
// lets also link the writer and reader to the client.
inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// make sure to always catch any exceptions that may occur.
} catch (UnknownHostException e) {
// always print error to "System.err"
publishProgress(e.toString());
// 2 different types of exceptions, so we want to output meaning
// information for both.
} catch (IOException e) {
publishProgress(e.toString());
}
// Boolean which indicates if the client is connected or not,
// if connected it takes in the next line of user input and returns the servers response.
while (connected) {
// Send the user message to the server
// read the reply from the server
String reply = null;
try {
reply = inFromServer.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
publishProgress("Failed to connect." );
System.exit(1);
}
if (reply != null){
// output the reply as a notification
if (isCancelled()){
break;
}
publishProgress(reply);
} else {
try {
inFromServer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
publishProgress(e.toString());
System.exit(1);
} // the reader
try {
clientSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
publishProgress(e.toString());
System.exit(1);
} // and the client socket
}
}
// always remember to close all connections.
// TODO Auto-generated method stub
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void onProgressUpdate(String... item) {
Notification("Push2Note: ", item[0]);
}
public void Notification(String contentTitle, String contentText) {
//Build the notification using Notification.Builder
long[] vibrate = {0,100,200,300};
PendingIntent pendingIntent;
Intent intent = new Intent();
intent.setClass(mContext,NotificationActivity.class);
pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
.setSmallIcon(android.R.drawable.presence_online)
.setAutoCancel(true)
.setVibrate(vibrate)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentIntent(pendingIntent)
.setContentTitle(contentTitle)
.setContentText(contentText);
//Get current notification
mNotification = builder.getNotification();
//Show the notification
mNotificationManager.notify(NOTIFICATION_ID, mNotification);
}
}
以下是我想要填充的活动:
public class NotificationActivity扩展了ListActivity {
/** Called when the activity is first created. */
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notifications);
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_checked, new ArrayList()));
}
}
我已经阅读了类似的问题,并听说过使用全局适配器,但不知道我怎么能实现这样的事情。
这是这个谜题的最后一部分,对我来说,我的申请仍然是一个谜,对此事的任何帮助都将不胜感激。
感谢您的时间,
一切顺利。
答案 0 :(得分:1)
您应该拥有ArrayList
使用的Adapter
,您可以从Activity
访问该public static
来修改它。
它可以是Activity
,也可以通过Activity
中的getter访问,该ArrayList
作为参数传递给invalidateViews()
。
当您访问ListView
时,您可以执行任何操作,然后在Activity
上为另一个items.remove(position);
MainListActivity.listView.invalidateViews();
致电getView()
。
{{1}}
现在,当您的适配器调用其{{1}}方法时,它会获取您更新的列表。
答案 1 :(得分:1)
一种方法是,将结果传递回活动,将它们添加到适配器列表并调用adapter.NotifyDatasetChanged();
答案 2 :(得分:0)
好吧,答案比我认为的更简单,而不是添加到异步任务中的数组列表,我在活动中创建了一个空数组列表,然后添加到适配器。但这确实意味着在运行AsyncTask之前活动必须处于活动状态(否则您尝试添加到不存在的适配器)但是为了我的目的,这很好。代码:
在ConnectionTask中,我将值传递给publishprogress,然后执行NotificationActivity.adapter.add(item[0]);
然后在我的活动中我现在有:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<String> mArrayList = new ArrayList<String>();
adapter = new ArrayAdapter<String>(this, R.layout.recentrow,mArrayList);
setListAdapter(adapter);
ListView listView = getListView();
listView.setTextFilterEnabled(true);
}
感谢所有帮助的人,没有你让我重新思考的事情,就不可能来到这里。