通过外部AsyncTask将项添加到活动中的列表视图

时间:2012-04-19 03:03:12

标签: java android listview android-asynctask android-arrayadapter

快速问题,我希望在与生成任务不同的活动中更新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()));

    }

}

我已经阅读了类似的问题,并听说过使用全局适配器,但不知道我怎么能实现这样的事情。

这是这个谜题的最后一部分,对我来说,我的申请仍然是一个谜,对此事的任何帮助都将不胜感激。

感谢您的时间,

一切顺利。

3 个答案:

答案 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);


}   

感谢所有帮助的人,没有你让我重新思考的事情,就不可能来到这里。