Spinner OnItemSelectedListener в персонализиран адаптер Listview извиква рекурсивно, без да избира никакъв елемент

Имам персонализиран изглед на списък с адаптери с изглед с два въртящи се изгледа.

Всеки спинър има фонов процес. При инициализиране spinner view.OnItemSelectedListener се извиква ненужно рекурсивно без външен вход към слушателя

Файл на класа

public class ClientListAdapter extends BaseAdapter implements SpinnerAdapter  {
Context context;
int layoutResourceId;
ArrayList<GetClientListDetail> data = null;
ArrayList<GetClientListDetail> temp = null;
String ID, str;
Typeface typeface;
PopupWindow cp;
private ProgressDialog progressDialog;

String[] Status1 = new String[] { "Waiting", "Away","No Show"};

String[] Status2 = new String[] { "In Service",
        "Generate Bill", "Completed" };

SpinnerAdapterlist TherapistAdapter = null;
ArrayAdapter<String> StatusAdapter = null;

ArrayList<GetTherapistProperties> TherapistList ;


private LayoutInflater inflater;

RemoveClient RC;
ChangeStatus CS;
ChangeTherapist CT;

ClientListHolder holder ;
int _therapistID;


GetClientListDetail ap;

GetTherapistProperties tp;

boolean networkavailable=false;




public ClientListAdapter(Context context, int textViewResourceId,
        ArrayList<GetClientListDetail> gld, ArrayList<GetTherapistProperties> therapislist) {
    super();
    this.layoutResourceId = textViewResourceId;
    this.context = context;
    this.data = gld;
    this.mGalleryCount1 = gld.size();
    this.mGalleryCount2=gld.size();
    this.TherapistList=therapislist;


    inflater=LayoutInflater.from(context);
    Resources res = context.getResources();

    TherapistAdapter = new SpinnerAdapterlist(context,
            R.layout.spinnerlayout, TherapistList);

    StatusAdapter = new ArrayAdapter<String>(context,
            android.R.layout.simple_dropdown_item_1line, Status1);
}

@Override
public int getCount() {

    return data.size();
}

@Override
public GetClientListDetail getItem(int position) {

    return data.get(position);
}

@Override
public long getItemId(int position) {

    return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;



    if (row == null) {

        holder = new ClientListHolder();


        row = inflater.inflate(layoutResourceId, parent, false);

        holder.tv_no = (TextView) row
                .findViewById(R.id.tv_clientwaitlayout_no);
        holder.tv_name = (TextView) row
                .findViewById(R.id.tv_clientwaitlayout_name);
        holder.tv_status = (Spinner) row
                .findViewById(R.id.tv_clientwaitlayout_status);
        holder.tv_therapist = (Spinner) row
                .findViewById(R.id.tv_clientwaitlayout_therapist);



        holder.iv_edit=(ImageView) row.findViewById(R.id.btn_clientwaitlayout_edit);

        holder.iv_action = (ImageView) row
                .findViewById(R.id.btn_clientwaitlayout_action);
        holder.tv_unchange_therapist=(TextView) row.findViewById(R.id.tv_clientwaitlayout_unchange_name);
        holder.tv_unchange_status=(TextView) row.findViewById(R.id.tv_clientwaitlayout_unchange_status);



        row.setTag(holder);
    } else {
        holder = (ClientListHolder) row.getTag();
    }


    holder.tv_therapist.setAdapter(TherapistAdapter);
    holder.tv_status.setAdapter(StatusAdapter);


    ap = data.get(position);
    tp=TherapistList.get(position);

    holder.tv_name.setText(ap.getCLDName());
    holder.tv_no.setText(ap.getCLDNo());


    if(ap.getCLDStatus().equals("1") ){
        Log.d("LOOP","Sub If condition");

        holder.tv_therapist.setVisibility(View.VISIBLE);
        holder.tv_status.setVisibility(View.VISIBLE);
        holder.tv_unchange_therapist.setVisibility(View.GONE);
        holder.tv_unchange_status.setVisibility(View.GONE);
        holder.iv_action.setVisibility(View.GONE);
        holder.iv_edit.setVisibility(View.VISIBLE);

        try {
            for(int x=0;x<TherapistList.size();x++){
                if(ap.getCLDTherapist().equals(TherapistList.get(x).getID())){

                    holder.tv_therapist.setSelection(x);

                }else{  

                }
            }
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            holder.tv_status.setSelection(Integer.parseInt(ap.getCLDStatus()) - 1);
        } catch (ArrayIndexOutOfBoundsException e2) {
            // TODO Auto-generated catch block
            holder.tv_status.setSelection(0);
        }


    }else if(ap.getCLDStatus().equals("2") | ap.getCLDStatus().equals("6")){

        holder.tv_therapist.setVisibility(View.VISIBLE);
        holder.tv_status.setVisibility(View.VISIBLE);
        holder.tv_unchange_therapist.setVisibility(View.GONE);
        holder.tv_unchange_status.setVisibility(View.GONE);
        holder.iv_action.setVisibility(View.GONE);
        holder.iv_edit.setVisibility(View.GONE);

        try {
            for(int x=0;x<TherapistList.size();x++){
                if(ap.getCLDTherapist().equals(TherapistList.get(x).getID())){

                    holder.tv_therapist.setSelection(x);

                }else{  

                }
            }
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            if(ap.getCLDStatus().equals("2")){
                holder.tv_status.setSelection(1);
            }else{
                holder.tv_status.setSelection(2);   
            }
        } catch (ArrayIndexOutOfBoundsException e2) {
            // TODO Auto-generated catch block
            holder.tv_status.setSelection(0);
        }


    }else{

        holder.tv_therapist.setVisibility(View.GONE);
        holder.tv_status.setVisibility(View.GONE);
        holder.tv_unchange_therapist.setVisibility(View.VISIBLE);
        holder.tv_unchange_status.setVisibility(View.VISIBLE);
        holder.iv_action.setVisibility(View.VISIBLE);
        holder.iv_edit.setVisibility(View.GONE);


        for(int y=0;y<TherapistList.size();y++){
            if(ap.getCLDTherapist().equals(TherapistList.get(y).getID())){

                holder.tv_unchange_therapist.setText(TherapistList.get(y).getName());

                break;
            }else{

                holder.tv_unchange_therapist.setText("Not Available");
            } 
        }
        if (ap.getCLDStatus().equals("2")) {

            holder.tv_unchange_status.setText(Status1[1]);

        } else if (ap.getCLDStatus().equals("3")) {

            holder.tv_unchange_status.setText(Status2[0]);

        } else if (ap.getCLDStatus().equals("4")) {
            holder.tv_unchange_status.setText(Status2[1]);

        } else if (ap.getCLDStatus().equals("5")) {
            holder.tv_unchange_status.setText(Status2[2]);

        } else if (ap.getCLDStatus().equals("6")) {

            holder.tv_unchange_status.setText(Status1[2]);
        }

    }



    holder.tv_therapist.setTag(ap.getCLDClientID());

    holder.tv_status.setTag(ap.getCLDClientID()); 

    holder.iv_edit.setTag(ap.getCLDClientID());

    holder.iv_action.setTag(ap.getCLDClientID());

    holder.iv_action.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try { 
                ImageView b = (ImageView) v;
                String id = b.getTag().toString();
                Log.d("ID is", id);

                Intent CDV=new Intent(context, TabSample.class);
                CDV.putExtra("ID",  id);
                //CDV.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                //context.startActivity(CDV);
                ((Activity) context).startActivityForResult(CDV,5);

                try {
                    Log.d("POSITION", "" + position + " "
                            + data.get(position).getCLDClientID());
                } catch (ArrayIndexOutOfBoundsException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });

    holder.tv_status
            .setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub


                        int id=arg2+1;


                        try {
                            try {


                                CS=new ChangeStatus();
                                CS.setClientID(data.get(position).getCLDClientID());
                                CS.setSalonID("1");
                                if(id==3){
                                    CS.setStatus("6");
                                }else{
                                    CS.setStatus(String.valueOf(id));
                                }


                                new LoadChangeStatus().execute();
                            } catch (ArrayIndexOutOfBoundsException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }


                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
            });


    holder.tv_therapist
    .setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub

                try { 

                    try {
                        Spinner sp = (Spinner) arg0;

                        String str = sp.getTag().toString();

                        TextView th_id=(TextView)arg1.findViewById(R.id.spnradptno);

                        CT=new ChangeTherapist();
                        CT.setClientID(str);
                        CT.setSalonID("1");
                        CT.setTherapist(th_id.getText().toString());

                        new LoadChangeTherapist().execute();

                        Log.d("SPR TXT", th_id.getText().toString()+" "+position+" "+str);

                    } catch (ArrayIndexOutOfBoundsException e) {
                        // TODO Auto-generated catch block 
                        Log.d("Error in spinner",e.toString());
                    } 

                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    Log.d("Error2 in spinner",e.toString());
                }


        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
            Log.d("Nothing","Selected");
        }
    });




    holder.iv_edit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            try { 
                ImageView b = (ImageView) v;
                String id = b.getTag().toString();
                Log.d("ID is", id);

                Intent CDV=new Intent(context, TabSample.class);
                CDV.putExtra("ID",  id);


                ((Activity) context).startActivityForResult(CDV,5);


                try {
                    Log.d("POSITION", "" + position + " "
                            + data.get(position).getCLDClientID());
                } catch (ArrayIndexOutOfBoundsException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });





    return row;
}

static class ClientListHolder {

    TextView tv_no;
    TextView tv_name;
    Spinner tv_therapist;
    Spinner tv_status;
    ImageView iv_action;

    ImageView iv_edit;
    TextView tv_unchange_therapist;
    TextView tv_unchange_status;

}

public class LoadChangeStatus extends AsyncTask<Integer, Integer, Integer> {
    // Before running code in the separate thread
    int LoadChangeStatus= 0;

    @Override
    protected void onPreExecute() {
        // Create a new progress dialog
        progressDialog = new ProgressDialog(context);
        // Set the progress dialog to display a horizontal progress bar
        // progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // Set the dialog title to 'Loading...'
        progressDialog.setTitle("Loading...");
        // Set the dialog message to 'Loading application View, please
        // wait...'
        progressDialog.setMessage("Loading, please wait...");
        // This dialog can't be canceled by pressing the back key
        progressDialog.setCancelable(false);
        // This dialog isn't indeterminate
        progressDialog.setIndeterminate(false);
        // The maximum number of items is 100

        // Set the current progress to zero

        // Display the progress dialog
        progressDialog.show();

    }

    // The code to be executed in a background thread.
    @Override
    protected Integer doInBackground(Integer... params) {

        try {
            // temp.clear();
            networkavailable=new Network().isNetworkAvailable(context);
            if(networkavailable){
                temp = CS.Change_Status(CS, context);   
                LoadChangeStatus=1;
            }else{
                LoadChangeStatus=2;
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("ERROR", "LoadChangeStatus backgroung");
        }
        return null;
    }

    // Update the progress
    @Override
    protected void onProgressUpdate(Integer... values) {
        // set the current progress of the progress dialog

    }

    // after executing the code in the thread
    @Override
    protected void onPostExecute(Integer result) {
        // close the progress dialog
        progressDialog.dismiss();

        if(LoadChangeStatus==1){
            try {
                data.clear();
                data.addAll(temp);
                notifyDataSetChanged();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }               
        }else if(LoadChangeStatus==2){
            Toast.makeText(context, "Network Not Available", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context, "Changing Status Failed. Please Try Again", Toast.LENGTH_LONG).show();
        }

    }
}

public class LoadChangeTherapist extends
        AsyncTask<Integer, Integer, Integer> {
    // Before running code in the separate thread
    int LoadChangeTherapist = 0;


    @Override
    protected void onPreExecute() {
        // Create a new progress dialog
        progressDialog = new ProgressDialog(context);
        // Set the progress dialog to display a horizontal progress bar
        // progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // Set the dialog title to 'Loading...'
        progressDialog.setTitle("Loading...");
        // Set the dialog message to 'Loading application View, please
        // wait...'
        progressDialog.setMessage("Loading, please wait...");
        // This dialog can't be canceled by pressing the back key
        progressDialog.setCancelable(false);
        // This dialog isn't indeterminate
        progressDialog.setIndeterminate(false);
        // The maximum number of items is 100

        // Set the current progress to zero

        // Display the progress dialog
        progressDialog.show();
    }

    // The code to be executed in a background thread.
    @Override
    protected Integer doInBackground(Integer... params) {

        try {
            // temp.clear();
            networkavailable=new Network().isNetworkAvailable(context);
            if(networkavailable){
                temp = CT.Get_Change_Therapist(CT, context);    
                LoadChangeTherapist=1;
            }else{
                LoadChangeTherapist=2;
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("ERROR", "LoadChangeStatus backgroung");
        }
        return null;
    }

    // Update the progress
    @Override
    protected void onProgressUpdate(Integer... values) {
        // set the current progress of the progress dialog

    }

    // after executing the code in the thread
    @Override
    protected void onPostExecute(Integer result) {
        // close the progress dialog
        progressDialog.dismiss();
        if (LoadChangeTherapist == 1) {
            try {
                data.clear();
                data.addAll(temp);
                notifyDataSetChanged();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else if (LoadChangeTherapist == 2) {
            Toast.makeText(context, "Network Not Available", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context, "Removing Client Failed. Please Try Again", Toast.LENGTH_LONG).show();
        }

    }
}

public class LoadRemoveClient extends AsyncTask<Integer, Integer, Integer> {
    // Before running code in the separate thread
    int LoadRemoveClient = 0;

    @Override
    protected void onPreExecute() {
        // Create a new progress dialog
        progressDialog = new ProgressDialog(context);
        // Set the progress dialog to display a horizontal progress bar
        // progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // Set the dialog title to 'Loading...'
        progressDialog.setTitle("Loading...");
        // Set the dialog message to 'Loading application View, please
        // wait...'
        progressDialog.setMessage("Loading, please wait...");
        // This dialog can't be canceled by pressing the back key
        progressDialog.setCancelable(false);
        // This dialog isn't indeterminate
        progressDialog.setIndeterminate(false);
        // The maximum number of items is 100

        // Set the current progress to zero

        // Display the progress dialog
        progressDialog.show();
    }

    // The code to be executed in a background thread.
    @Override
    protected Integer doInBackground(Integer... params) {

        Log.d("ERROR", "LoadRemoveClient backgroung");
        try {
            networkavailable=new Network().isNetworkAvailable(context);
            if(networkavailable){
                temp = RC.Get_Client_List_Detail(RC, context);  
                LoadRemoveClient=1;
            }else{
                LoadRemoveClient=2;
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    // Update the progress
    @Override
    protected void onProgressUpdate(Integer... values) {
        // set the current progress of the progress dialog

    }

    // after executing the code in the thread
    @Override
    protected void onPostExecute(Integer result) {
        // close the progress dialog
        progressDialog.dismiss();
        if (LoadRemoveClient == 1) {
            try {
                data.clear();
                data.addAll(temp);
                notifyDataSetChanged();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else if (LoadRemoveClient == 2) {
            Toast.makeText(context, "Network Not Available", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context, "Removing Client Failed. Please Try Again", Toast.LENGTH_LONG).show();
        }


    }
}

}

Как да избегнем ненужно извикване на view.OnItemSelectedListener на spinner view При инициализиране на изглед на персонализиран адаптерен списък


person user2634966    schedule 13.12.2013    source източник


Отговори (2)


Не можете да спрете или избегнете извикването на onItemSelectedListener при инициализация. Но можете да предотвратите това, като декларирате цяло число и зададете стойност като 0 и докато извиквате метода getview, проверете цялото число с размера на данните (размера на списъка на вашия масив). ако цялото число е по-малко от размера, увеличете стойността на цялото число, иначе направете вашата основна работа. Но това не е правилният начин да го направите, защото когато превъртите списъка, същият проблем възниква отново. Правите това, ако имате фиксиран размер на списъка с масиви. По-добре е да използвате AutoCompleteTextView вместо SpinnerView.

person Nas    schedule 18.12.2013
comment
Но аз искам само spinner изглед в списъка. Само потребителят може да го промени, но изгледът на текст за автоматично довършване позволява на потребителя да го редактира. За моя въпрос не става. - person user2634966; 18.12.2013
comment
Не, можете да направите същото с AutoCompleteTextview. setEditable на false и setBackground към него като spinnerview като. След това имплементирайте onTouchListener към него. Тук показвате списъка с метода showDropDown(), след което можете да изберете елемента в списъка с onItemClickListener и да извършите фоновия процес в него. - person Nas; 18.12.2013
comment
Добре, ще го пробвам и ще те върна. - person user2634966; 18.12.2013

Извиква се за избор на първия елемент (Вид стойност по подразбиране).

Опитайте едно нещо, не настройвайте адаптера на spinner if row!=null за пример:

 if (row == null) {

        holder = new ClientListHolder();


        row = inflater.inflate(layoutResourceId, parent, false);

        holder.tv_no = (TextView) row
                .findViewById(R.id.tv_clientwaitlayout_no);
        holder.tv_name = (TextView) row
                .findViewById(R.id.tv_clientwaitlayout_name);
        holder.tv_status = (Spinner) row
                .findViewById(R.id.tv_clientwaitlayout_status);
        holder.tv_therapist = (Spinner) row
                .findViewById(R.id.tv_clientwaitlayout_therapist);



        holder.iv_edit=(ImageView) row.findViewById(R.id.btn_clientwaitlayout_edit);

        holder.iv_action = (ImageView) row
                .findViewById(R.id.btn_clientwaitlayout_action);
        holder.tv_unchange_therapist=(TextView) row.findViewById(R.id.tv_clientwaitlayout_unchange_name);
        holder.tv_unchange_status=(TextView) row.findViewById(R.id.tv_clientwaitlayout_unchange_status);

        holder.tv_therapist.setAdapter(TherapistAdapter);
        holder.tv_status.setAdapter(StatusAdapter);

        row.setTag(holder);
    } else {
        holder = (ClientListHolder) row.getTag();
    }
person vipul mittal    schedule 13.12.2013
comment
благодаря ви за отговора. Но се извика рекурсивно. Има ли някакъв начин да се избегне извикването на първия избор на елемент? - person user2634966; 13.12.2013
comment
вече опитах със същия код, както ти публикува, не работи - person user2634966; 13.12.2013