как предотвратить создание дублирующего элемента при прокрутке моего реселлера - PullRequest
0 голосов
/ 15 ноября 2018

Вот мой AdapterClass AvailablePateientAdapter.java Пожалуйста, дайте мне знать, как решить эту проблему, прокручивая мое окно повторного просмотра каждый раз, увеличивая количество повторяющихся элементов. Заранее спасибо.

public class AvailablePatientsAdapter extends RecyclerView.Adapter<AvailablePatientsAdapter.AvailablePatientListViewHolder> {
    static ReportData patData = null;
    private static String niramaiID= null;

    static ProgressBar progBar ;
    private static ProgressDialog progressDialog;
    private static LayoutInflater mInflater = null;
    private static ViewPendingList viewPendingList;
    private static List<PatientData> patients;
    private static Context mContext;
    static boolean isPending = false;
    int postion;
    private static boolean clicked = true;
    static String repStatus ;
    static Handler viewPatHandler= new Handler(){
        @Override
        public void handleMessage(Message msg){
            patData.setStatusReport(repStatus);
//            progressDialog.show();

            if(niramaiID != null) {
                if (msg.what == 1) {
                    getexaminationtable(niramaiID);
                } else if (msg.what == 2) {
                    getsegmentationtable(niramaiID);
                } else if (msg.what == 3) {
                    getthanalysistable(niramaiID);
                } else if (msg.what == 4) {
                    Log.d(Config.LOG_TAG, "Response:1 status report " + patData.getStatusReport());
                    String viewPat = patData.toJson();
                    Intent addPatFromEdit = new Intent();
                    addPatFromEdit.setClass(mContext, DisplayReport.class);
                    addPatFromEdit.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    addPatFromEdit.putExtra("display_report", viewPat);
//                    addPatFromEdit.putExtra("is_pending",isPending);
                    if(progressDialog.isShowing()) {
                        progressDialog.hide();
                    }
                    mContext.startActivity(addPatFromEdit);
                    progBar.setVisibility(View.GONE);
                }
            }else
            {
                if(progressDialog.isShowing()) {
                progressDialog.hide();
            }
                Toast.makeText(mContext,"Niramai id is null ",Toast.LENGTH_SHORT).show();
            }

        }
    };

    static class AvailablePatientListViewHolder extends RecyclerView.ViewHolder{
        private static SimpleDateFormat oudSdf = new SimpleDateFormat("dd-MMM-yyyy");
        private static SimpleDateFormat inSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        AvailablePatientsAdapter mPatientBinding;
        ViewPendingList viewPendingList;



        AvailablePatientListViewHolder(View itemView) {

            super(itemView);

        }

//       public AvailablePatientListViewHolder(ViewPendingList viewPendingList,View item){
//           super(item);
//           this.viewPendingList = viewPendingList;
//        }

        void bind(final PatientData data) {
            RelativeLayout b = itemView.findViewById(R.id.rel_available);
            niramaiID = data.getNiramaiId();
//            progBar.setVisibility(View.VISIBLE);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    v.postDelayed(new Runnable(){
                        @Override
                        public void run() {

                            Log.d(Config.LOG_TAG," data.getStatus() :: "+data.getStatus());
                            int muID;
                            if(NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,mContext) != 0)
                            {
                                muID =  NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,mContext);
                            }else
                            {
                                muID =  LoggedInUser.Users.getDetails().getMu().get(0).getId();
                            }
                            getPatientDetails(itemView.getContext(), data.getStatus(),muID ,data.getNiramaiId(),data.getPatientId(), itemView);
                            progBar.setVisibility(View.GONE);


                        }
                    },500);



                }
            });


            TextView patientID = (TextView) itemView.findViewById(R.id.patientID);
            TextView scandate = (TextView) itemView.findViewById(R.id.scanDate);

            try {
                scandate.setText(oudSdf.format(inSdf.parse(data.getScanDate())));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            patientID.setText(data.getPatientId());
        }


        AvailablePatientsAdapter getPatientBinding(){
            return this.mPatientBinding;
        }

    }


    public AvailablePatientsAdapter(Context c, @Nullable List<PatientData> p){
        mContext=c;
        patients = p;
        setHasStableIds(true);
        progressDialog = new ProgressDialog(mContext);
        progressDialog.setTitle("Please wait");
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
    }

    @Override
    public AvailablePatientListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.available_patient_list, parent, false);
        mContext = parent.getContext();
        progBar = new ProgressBar(parent.getContext());
        return new AvailablePatientListViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(AvailablePatientListViewHolder holder, int position) {
//        Log.e("ADAPTER","pos:"+position );
        final PatientData p = patients.get(position);
        holder.bind(p);
        holder.setIsRecyclable(false);

    }

    @Override
    public int getItemCount() {
        return patients.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }


    public void setPatientList(List<PatientData> p, Boolean isPendingActivity){
        isPending = isPendingActivity;
        patients = p;
        notifyDataSetChanged();
    }

    // Dharam
     public  void clickOnRecyclerViewItem(boolean click){
        clicked = click;
    }

    private static void getPatientDetails(final Context context, final String status, int muID, String niramaiID, String pID, final View itemView){
        if(!progressDialog.isShowing()) {
            progressDialog.show();
        }

        ApiInterface mApiService = RetrofitFactory.getInterfaceService();
        Log.d(Config.LOG_TAG,"Call Start muID in Av Report :: "+muID+" niramaiID :: "+niramaiID+" pID :: "+pID);
        repStatus = status;
        mApiService.getPatientReportData(muID,niramaiID,pID).enqueue(new Callback<ReportData>() {
            @Override
            public void onResponse(Call<ReportData> call, Response<ReportData> response) {
                patData =  response.body();
                Log.d(Config.LOG_TAG,"patData status color "+ patData);
//                progBar.setVisibility(View.VISIBLE);
                viewPatHandler.sendEmptyMessage(1);
            }


            @Override
            public void onFailure(Call<ReportData> call, Throwable t) {
//                itemView.setClickable(true);
                Log.e(Config.LOG_TAG,"An getPatientDetails Error Occured: "+t.getMessage());
            }
        });
    }

    private static void getexaminationtable(String niramaiId) {
        ApiInterface mApiService = RetrofitFactory.getInterfaceService();
        Log.d(Config.LOG_TAG,"getexaminationtable Start");
        if(!progressDialog.isShowing()) {
            progressDialog.show();
        }
        mApiService.getExaminationTable(niramaiId).enqueue(new Callback<List<CBEData>>() {
            @Override
            public void onResponse(Call<List<CBEData>> call, Response<List<CBEData>> response) {
                Log.d(Config.LOG_TAG, "Response Body :: "+response.body());
                if(response.body() != null && response.body().size()>=1) {
                    viewPatHandler.sendEmptyMessage(2);
                }
            }

            @Override
            public void onFailure(Call<List<CBEData>> call, Throwable t) {
                Log.e(Config.LOG_TAG,"An getexaminationtable Error Occured: "+t.getMessage());
            }
        });
    }

    private static void getsegmentationtable(String niramaiId) {
        ApiInterface mApiService = RetrofitFactory.getInterfaceService();
        Log.d(Config.LOG_TAG,"getsegmentationtable Start");
        if(!progressDialog.isShowing()) {
            progressDialog.show();

        }
        mApiService.getSegmentationTable(niramaiId).enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
                response.body();
                viewPatHandler.sendEmptyMessage(3);
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                Log.e(Config.LOG_TAG,"An getsegmentationtable Error Occured: "+t.getMessage());
            }
        });
    }

    private static void getthanalysistable(String niramaiId) {
        ApiInterface mApiService = RetrofitFactory.getInterfaceService();
        Log.d(Config.LOG_TAG,"getthanalysistable Start");
        if(!progressDialog.isShowing()) {
            progressDialog.show();
        }
        mApiService.getthanAlysisTable(niramaiId).enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
                response.body();
                viewPatHandler.sendEmptyMessage(4);
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                Log.e(Config.LOG_TAG,"An getthanalysistable Error Occured: "+t.getMessage());
            }
        });
    }
}

Вот моя активность AvailablePateint.class пожалуйста, дайте мне знать, почему это происходит каждый раз при прокрутке.

public class AvailablePatients extends Activity {


    @BindView(R.id.patientsSwipeView) SwipeRefreshLayout swipeContainer;
    @BindView(R.id.patientList) RecyclerView patientListView;
    @BindView(R.id.searchBox) EditText searchBox;

    private Context context;
    private boolean clicked;
    static String MY_PREFS_NAME = "NIRAMAI_PREFERENCE";
    String LOG_TAG = "Niramai";
    ApiInterface mApiService;

    List<PatientData> allPatientData;
    List<PatientData> displayPatientData;
    List<PatientData> filteredPatientData;
    List<PatientData> availablePatData;
    Patients patient;
    //    List<patient_> patient_ = null;
    private AvailablePatientsAdapter mPA;
    private user mLoginObject;
    //    List<IndividualPatient> eachpatient = null;
    @BindView(R.id.drawerView)    PlaceHolderView mDrawerView;
    @BindView(R.id.drawerLayout)    DrawerLayout mDrawer;
    @BindView(R.id.toolbar_all)    Toolbar mToolbar;

    int muid = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_final_report);
        availablePatData = new ArrayList<>();
        context = this;
        ButterKnife.bind(this);
        mLoginObject = LoggedInUser.Users.getDetails();
        if(mLoginObject == null)
        {
            Toast.makeText(this,"Please Login Again !!",Toast.LENGTH_LONG).show();
            Intent myIntent = new Intent(this, LoginActivity.class);
            //dharam

            myIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK );
            ComponentName cn = myIntent.getComponent();
            Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
            startActivity(mainIntent);
            finish();
        }
        SharedPreferences pref = getSharedPreferences("NiramaiPrefrence", Context.MODE_PRIVATE);
        if(mLoginObject != null) {
            muid = mLoginObject.getMu().get(0).getId();
        }
        mPA = new AvailablePatientsAdapter(this,new ArrayList<PatientData>());
        patientListView.setLayoutManager(new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL,
                false));
        RecyclerSectionItemDecoration sectionItemDecoration =
                new RecyclerSectionItemDecoration(false,getResources().getDimensionPixelSize(R.dimen.recycler_section_header_height),
                        true,
                        getSectionCallback());
        patientListView.addItemDecoration(sectionItemDecoration);
        patientListView.setAdapter(mPA);



        searchBox.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                displayPatientData = new ArrayList<>();
                if(availablePatData==null) return;
                for(PatientData pd : availablePatData){

                    if (pd.getPatientId().contains(charSequence)){
                        displayPatientData.add(pd);
                    }
                }
                Collections.sort(displayPatientData, new Comparator<PatientData>() {
                    @Override
                    public int compare(PatientData p1, PatientData p2) {
                        return p1.getPatientId().compareTo(p2.getPatientId());
                    }
                });

                mPA.setPatientList(displayPatientData,false);
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }


        });

        swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeContainer.setRefreshing(true);
                if(NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,AvailablePatients.this) != 0) {
                    getAllPatientDataWithRetrofit((NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,AvailablePatients.this)));

                }else
                {
                    getAllPatientDataWithRetrofit(muid);

                }
            }
        });

        swipeContainer.setRefreshing(true);
        if(NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,AvailablePatients.this) != 0) {
            getAllPatientDataWithRetrofit((NiramaiMythriApplication.getDefaultInt(UNINVERSAL_MUID,AvailablePatients.this)));

        }else
        {
            getAllPatientDataWithRetrofit(muid);

        }
        setupDrawer();
    }




    private RecyclerSectionItemDecoration.SectionCallback getSectionCallback() {
        return new RecyclerSectionItemDecoration.SectionCallback() {
            @Override
            public boolean isSection(int position) {
                return false;
            }

            @Override
            public CharSequence getSectionHeader(int position) {
                return "Patient ";
            }
        };
    }

    private void availablePatData(List<PatientData> patData) {

        int j = 0;
        Log.d(Config.LOG_TAG, "size" + patData.size());
        for (int i = 0; i < patData.size(); i++) {
//            Log.d(Config.LOG_TAG, "Patient id" + patData.get(i).getPatientId());
            if (patData.get(i).getStatus().equalsIgnoreCase(getResources().getString(R.string.report_status_available)) ||
                    patData.get(i).getStatus().equalsIgnoreCase(getResources().getString(R.string.report_status_screening_done))) {
                availablePatData.add(j,patData.get(i));
                j++;
            }
        }
    }

    private void getAllPatientDataWithRetrofit(int muID) {
        mApiService = RetrofitFactory.getInterfaceService();
        Call mService = mApiService.getAllPatients(muID);
        mService.enqueue(new Callback<List<Patients>>() {
            @Override
            public void onResponse(Call<List<Patients>> call, Response<List<Patients>> response) {
                if(response.isSuccessful()) {
                    patient= response.body().get(0);

                    allPatientData = patient.getPatientData();

                    try {
                        filteredPatientData = filterPatients(allPatientData);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    availablePatData(filteredPatientData);
                    displayPatientData = availablePatData;
                    mPA.setPatientList(displayPatientData,false);
                    mPA.notifyDataSetChanged();
                    swipeContainer.setRefreshing(false);

                    Log.d(LOG_TAG,"Response string is ::: "+ patient.toString());
                }
            }

            @Override
            public void onFailure(Call<List<Patients>> call, Throwable t) {
                call.cancel();
                swipeContainer.setRefreshing(false);
                Log.e(LOG_TAG,"getAllPatientDataWithRetrofit process failed in response: "+t.getMessage());
            }
        });
        if(mService.isExecuted())
        {

        }
    }

    // Filters All patient to keep only single latest record of each patient id
    private List<PatientData> filterPatients(List<PatientData> allPatientData) throws ParseException {

        HashMap<String ,Pair<PatientData,Date>> filtered = new HashMap<>();
        SimpleDateFormat inSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        for(PatientData p : allPatientData){
            if(filtered.containsKey(p.getPatientId())){
                Pair<PatientData,Date> _p = filtered.get(p.getPatientId());
                Date d1 = _p.second;
                Date d2 = inSdf.parse(p.getScanDate());
                if(d2.after(d1)){
                    filtered.put(p.getPatientId(), new Pair<>(p, d2));
                }
            }else{
                if(p.getScanDate() != null)
                    filtered.put(p.getPatientId(), new Pair<>(p, inSdf.parse(p.getScanDate())));
            }
        }


        List<Pair<PatientData,Date>> filteredPairs = new ArrayList<>(filtered.values());
        Collections.sort(filteredPairs,new Comparator<Pair<PatientData, Date>>() {
            @Override
            public int compare(Pair<PatientData, Date> t1, Pair<PatientData, Date> t2) {
                if(t1.second.after(t2.second)){
                    return -1;
                }else if (t1.second.before(t2.second)){
                    return 1;
                }
                else
                    return t1.first.getPatientId().compareTo(t2.first.getPatientId());
            }
        });
        List<PatientData> filteredList = new ArrayList<>(filteredPairs.size());

        for(Pair<PatientData,Date> p : filteredPairs){
            filteredList.add(p.first);
        }
        return filteredList;
    }



    @Override
    protected void onResume() {
        super.onResume();
        mPA.clickOnRecyclerViewItem(true);

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }

    private void setupDrawer(){
        mDrawerView
                .addView(new DrawerHeader())
                .addView(new DrawerMenuItem(this.getApplicationContext(),1))
                .addView(new DrawerMenuItem(this.getApplicationContext(),2))
                .addView(new DrawerMenuItem(this.getApplicationContext(),3))
                .addView(new DrawerMenuItem(this.getApplicationContext(),4));

        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawer, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close){
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }
        };
        mDrawer.addDrawerListener(drawerToggle);
        drawerToggle.syncState();
    }
}

1 Ответ

0 голосов
/ 15 ноября 2018

Обычно, когда мы добавляем новый элемент в список, он должен обновить его, но при обновлении вы увидите дубликаты существующих элементов, поскольку предыдущий список не был пустым, в списке были некоторые элементы. Поэтому сначала очистите список, прежде чем добавлять элементы в список.

добавить следующие изменения в ActivityPatient.java

private void availablePatData(List<PatientData> patData) {

        int j = 0;

        if(availablePatData.size()>=0){
        availablePatData.clear();

        }

        Log.d(Config.LOG_TAG, "size" + patData.size());
        for (int i = 0; i < patData.size(); i++) {
//            Log.d(Config.LOG_TAG, "Patient id" + patData.get(i).getPatientId());
            if (patData.get(i).getStatus().equalsIgnoreCase(getResources().getString(R.string.report_status_available)) ||
                    patData.get(i).getStatus().equalsIgnoreCase(getResources().getString(R.string.report_status_screening_done))) {
                availablePatData.add(j,patData.get(i));
                j++;
            }
        }
    }
...