Spinner OnItemSelectedListener в пользовательском адаптере Listview вызывает рекурсивно, не выбирая какой-либо элемент

У меня есть собственный вид списка адаптеров с двумя видами счетчика.

У каждого счетчика есть фоновый процесс. При инициализации вид счетчика. 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 При инициализации пользовательского представления списка адаптеров


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


Ответы (2)


Вы не можете остановить или избежать вызова onItemSelectedListener при инициализации. Но вы можете предотвратить это, объявив целое число и установив значение как 0, а при вызове метода getview проверьте целое число с размером данных (размер вашего списка массивов). Если целое число меньше размера, чем увеличьте целочисленное значение, иначе сделайте ваша фоновая работа. Но это неправильный способ, потому что при прокрутке списка та же проблема возникает снова. Вы делаете это, если у вас фиксированный размер списка массивов. Лучше использовать AutoCompleteTextView вместо SpinnerView.

person Nas    schedule 18.12.2013
comment
Но мне нужен только вид счетчика в списке. Пользователь может только изменить его, но текстовое представление автозаполнения позволяет пользователю редактировать его. Это не работает для моего вопроса. - 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

Он вызывается для выбора первого элемента (вид значения по умолчанию).

Попробуйте одну вещь: не устанавливайте адаптер на счетчик, если 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