0

Wi-FiチャネルのListViewを作成しましたが、正常に機能します。onResume()はAsyncTaskを呼び出してリストを更新しますが、更新後、再度設定しようとしてもクリックリスナーが機能しなくなります。これが私のコードです:

package co.uk.company.application.ui.wifi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import co.uk.company.application.R;
import co.uk.company.application.injected.ApplicationGlobalState;
import co.uk.company.application.ui.companyActivity;
import co.uk.company.application.ui.dialog.YesNoAlertDialogCreator;
import co.uk.company.sources.telnet.WifiTelnetClass;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.Vector;
import roboguice.inject.InjectView;

public class WifiAPsActivity extends companyActivity{
    @Inject private ApplicationGlobalState applicationGlobalState;
    @InjectView(R.id.wifi_networks_list) private ListView listView1;
    private WifiChannels wifiChannels;
    private WifiChannel channelSelected;
    private ArrayList<WifiChannel> data;
    private ArrayList<WifiChannel> dataold;
    private Vector <WifiChannel> vect;
    private WifiAPsAdapter adapter;
    private RealtimeUpdateScreen realtimeUpdateScreen;
    private AdapterView.OnItemClickListener listener;
    @Override
    public void onCreate(Bundle savedInstanceState){
        Log.w("","onCreate(...) start");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi_networks);
        listener= new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) {
                arg0.showContextMenuForChild(arg1);
                //if(adapter.getItem(arg2).toString().endsWith(".txt"))
                Toast.makeText(getApplicationContext(),getString(R.string.loading), Toast.LENGTH_LONG).show();                
            }
        };
        dataold= new ArrayList<WifiChannel>();
        data =new ArrayList<WifiChannel>();
        wifiChannels=applicationGlobalState.wifiCurrentChannels;
        if (wifiChannels != null)
                for(WifiChannel chn : wifiChannels.getChannels()){
                        dataold.add(chn);
                        data.add(chn);
                }
        wifiChannels=applicationGlobalState.wifiCurrentChannels5GHz;
        if (wifiChannels != null)
                for(WifiChannel chn : wifiChannels.getChannels()){
                        dataold.add(chn);
                        data.add(chn);
                }
        adapter = new WifiAPsAdapter(this,R.layout.wifi_networks_item_row, data);
        listView1.setAdapter(adapter);
        listView1.setItemsCanFocus(false);
        registerForContextMenu(listView1);
        listView1.setOnItemClickListener(listener);
        Log.w("","onCreate(...) finish");
    }

    @Override
    public void onResume(){
        Log.w("","onResume() start");
        super.onResume();
        //realtimeUpdateScreen = new RealtimeUpdateScreen();
        //realtimeUpdateScreen.execute(new Object());
        Log.w("","onResume() finish");
    }

    @Override
    public void onPause(){
        super.onPause();
        realtimeUpdateScreen.cancel(true);
        realtimeUpdateScreen = null;
        Log.w("","onPause() finish");
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){
        Log.w("","onCreateContextMenu");
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        // menu.setHeaderTitle(fileNames.get(info.position));
        channelSelected = data.get(info.position);
        menu.add(Menu.NONE, 0, 0, "Connect");
        menu.add(Menu.NONE, 1, 1, "Disconnect");
        menu.add(Menu.NONE, 2, 2, "Do nothing");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        Log.w("","onContextItemSelected");
        int menuItemIndex = item.getItemId();
        //final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        switch (menuItemIndex){
        case 0:
            final AlertDialog.Builder alert = new AlertDialog.Builder(this);

                LayoutInflater li = LayoutInflater.from(this);
                View promptsView = li.inflate(R.layout.dialog_with_text_fields, null);
                alert.setView(promptsView);
                final TextView SSIDfield = (TextView) promptsView.findViewById(R.id.ssid_field);
                final EditText input2 = (EditText) promptsView.findViewById(R.id.password_field);
                SSIDfield.setText(channelSelected.getName());
//                final Button okButton = (Button)   promptsView.findViewById(R.id.wifi_button_yes);
//                final Button cancelButton =(Button)promptsView.findViewById(R.id.wifi_button_no);
//                okButton.setOnClickListener(new View.OnClickListener() {
//                    @Override
//                    public void onClick(View arg0) {
//
//                    }
//                });
//
//                cancelButton.setOnClickListener(new View.OnClickListener() {
//                    @Override
//                    public void onClick(View arg0) {
//                       // alert.
//                    }
//                });

                alert.setPositiveButton("OKK",
                      new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog,int id) {
                            String SSID = channelSelected.getName();
                            String PASSWORD = input2.getText().toString().trim();
                            if(WifiTelnetClass.getInstance().connect(SSID, PASSWORD))
                                Toast.makeText(getApplicationContext(), SSID+" Connected", Toast.LENGTH_SHORT).show();
                            else Toast.makeText(getApplicationContext(), "Not Connected!", Toast.LENGTH_SHORT).show();
                        }
                      });

                alert.setNegativeButton("CCancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            dialog.cancel();
                        }
                    });
                alert.show();
            break;
        case 1:
            YesNoAlertDialogCreator.create(this, "Are You Sure?",
            getString(R.string.sure_delete_result), new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(getApplicationContext(),"Disconnecting!!", Toast.LENGTH_LONG).show();
                    if(WifiTelnetClass.getInstance().disconnect())
                        Toast.makeText(getApplicationContext(), " Disconnected", Toast.LENGTH_SHORT).show();
                    else Toast.makeText(getApplicationContext(), "Not Disconnected!", Toast.LENGTH_SHORT).show();
                }
            }).show();           
            Toast.makeText(getApplicationContext(),"Nothing!!!", Toast.LENGTH_LONG).show();
            break;
        case 2:
            YesNoAlertDialogCreator.create(this, "Password please!!!",
            getString(R.string.sure_delete_result), new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int whichButton) {
                }
            }).show();
            Toast.makeText(getApplicationContext(),"It!", Toast.LENGTH_LONG).show(); 
            break;   
        }
        return true;
    }

    class RealtimeUpdateScreen extends AsyncTask{
        @Override
            protected void onPreExecute(){
                try{

                    Thread.sleep(50L);
                }catch(Exception e){}
        }
        @Override
        protected Object doInBackground(Object... arg0){
            while(!isCancelled()){
                try{
                    if(wifiChannels!=applicationGlobalState.wifiCurrentChannels)
                        publishProgress(arg0);
                    try{Thread.sleep(50);}catch(Exception e){}
                }catch(Exception e){Log.e("","",e);}
            }
            return null;
        }
        protected void onProgressUpdate(Object...objects ){
            try{
                for(WifiChannel chn_ : dataold){
                    adapter.remove(chn_);
                }
            }catch(Exception e){Log.e("","",e);}
            try{
                dataold = new ArrayList<WifiChannel>();
                //adapter.notifyDataSetChanged();
                vect=applicationGlobalState.wifiCurrentChannels5GHz.getChannels();
                for(WifiChannel chn : vect){
                    dataold.add(chn);
                    adapter.add(chn);
                }                
                vect=applicationGlobalState.wifiCurrentChannels.getChannels();
                for(WifiChannel chn : vect){
                    dataold.add(chn);
                    adapter.add(chn);
                }
                adapter.notifyDataSetChanged();
            }catch(Exception e){Log.e("","",e);}
        }
    }
}

それは何でしょうか?ありがとう!

4

1 に答える 1

0

見つかりました:各notifyDataSetChangedの後にsetOnItemClickListenerを再度設定する必要があります。

于 2013-02-18T13:58:42.590 に答える