0

快速提问,我希望在与生成任务不同的活动中从异步任务更新列表视图。我的问题是关于在其他活动中更新适配器,我将如何访问其他活动适配器以便我可以添加到它(使用 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);
}

}

这是我希望填充的活动:

公共类 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()));

    }

}

我读过类似的问题,听说过使用全局适配器,但不知道如何实现这样的事情。

这是难题的最后一块,对我的应用程序来说仍然是一个谜,对此问题的任何帮助将不胜感激。

谢谢你的时间,

祝一切顺利。

4

3 回答 3

1

你应该有一个ArrayListwhichAdapter使用,你可以从Activity修改它。它可以是public static或者可以通过 getter 从Activity作为参数传递给Activity.

当您访问 时,您可以做任何您想做的ArrayList事情,然后调用另一个。invalidateViews()ListViewActivity

items.remove(position);
MainListActivity.listView.invalidateViews();

现在,当您的 Adapter 调用它的getView()方法时,它会获取您更新的列表。

于 2012-04-19T05:32:09.110 回答
1

一种方法是,将结果传递回活动,将它们添加到适配器列表并调用 adapter.NotifyDatasetChanged();

于 2012-04-19T05:47:56.220 回答
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);


}   

感谢所有帮助家伙,如果没有你让我重新思考事情,就不可能到达这里。

于 2012-04-19T18:53:11.193 回答