0

簡単な質問です。タスクが生成されたアクティビティとは異なるアクティビティで、非同期タスクからリスト ビューを更新しようとしています。私の質問は、他のアクティビティでアダプタを更新することに関するものです。他のアクティビティ アダプタにアクセスして (adapter.add(item); を使用して) アダプタに追加し、アダプタに変更を通知してリストを更新するにはどうすればよいですか?他のアクティビティ (adapter.notifyChange();) ?

接続タスクは次のとおりです。

public class ConnectionTask extends 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()));

    }

}

同様の質問を読んで、グローバルアダプターの使用について聞いたことがありますが、そのようなことをどのように実装できるかわかりません。

これは、私のアプリケーションで謎のままであるパズルの最後のピースであり、問​​題に関する助けがあれば大歓迎です.

御時間ありがとうございます、

ではごきげんよう。

4

3 に答える 3

1

が使用し、 からアクセスできる が必要です。ArrayListこれは、それを変更します。にパラメータとして渡されるから getter を介してアクセスすることも、アクセスすることもできます。AdapterActivitypublic staticActivityActivity

にアクセスするArrayListと、好きなことをしてから、 を呼び出しinvalidateViews()ListView他の を呼び出すことができますActivity

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

これで、アダプターがそのgetView()メソッドを呼び出すと、更新したリストが取得されます。

于 2012-04-19T05:32:09.110 に答える
1

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 に答える