繁体   English   中英

从单选组值中选择一个并向下滚动,然后在 Recycler View 中自动选择一些项目(初学者)

[英]Selecting one from radio group value and scrolling down and some item selected automatically in Recycler View( beginner)

我正在制作一个考勤系统,我使用 RadioGroup 进行考勤,有两个选项。 当我选择一些单选按钮并向下滚动时,其他一些单选按钮会被自动选中。 如果我改变它们,上面的也会改变。

主班

public class TeacherAttendanceActivity extends AppCompatActivity implements AttendanceAdapter.AttendanceAdapterListner {

    public static TeacherAttendanceActivity  teacherAttendanceActivity;
    private static final String TAG = TeacherAttendanceActivity.class.getSimpleName();

    List<AttendanceModel> listItems;
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;

    private AttendanceAdapter attendanceAdapter;
    ProgressDialog progressDialog;

    private SQLiteHandler db;
    private SessionManager session;

    private SearchView searchView;
    Button btnSubmit;
    JSONObject mainObj = new JSONObject();
    // date
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String currentDateandTime = sdf.format(new Date());

    String class_id,title;
    Boolean Error;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_teacher_attendance);
        //get data from intent
        class_id = super.getIntent().getExtras().getString("id"); //class_id
        title = super.getIntent().getExtras().getString("title");
        getSupportActionBar().setTitle("Class: "+title+", Date: "+currentDateandTime );



        // SqLite database handler
        db = new SQLiteHandler(getApplicationContext());
        // session manager
        session = new SessionManager(getApplicationContext());

        btnSubmit=findViewById(R.id.buttonAttendanceSubmit);

        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Error=false;
                Gson gson=new Gson();
                final String newDataArray=gson.toJson(listItems); // dataarray is list aaray

                    for (int i = 0; i < AttendanceAdapter.listItems.size(); i++){
                    if(AttendanceAdapter.listItems.get(i).getAttendance()==null){
                        Toast.makeText(TeacherAttendanceActivity.this, "Check attendance at roll:"+AttendanceAdapter.listItems.get(i).getRoll(), Toast.LENGTH_SHORT).show();
                        Error =true;
                        break;
                    }

                }
                if (!Error){
                    request(class_id,currentDateandTime,newDataArray);
                }

            }
        });


        listItems = new ArrayList<>();
        attendanceAdapter = new AttendanceAdapter(listItems, this, (AttendanceAdapter.AttendanceAdapterListner) this);

        recyclerView = (RecyclerView) findViewById(R.id.list_attendance);
        recyclerView.setLayoutManager(new LinearLayoutManager(TeacherAttendanceActivity.this));
        progressDialog = new ProgressDialog(this);

        teacherAttendanceActivity = this;
        //refresh_list(class_id);

    }

    @Override
    protected void onStart() {
        refresh_list(class_id);
        super.onStart();
    }

    @Override
    public void onAttendanceAdapterSelected(AttendanceModel model) {

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.refresh, menu);
        getMenuInflater().inflate(R.menu.tool_bar, menu);

        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.action_settings:
                Toast.makeText(getApplicationContext(),"Sittings",Toast.LENGTH_LONG).show();
                return true;
            case R.id.action_logout:
                logoutUser();
                return true;
            case R.id.action_about:
                Toast.makeText(getApplicationContext(),"About",Toast.LENGTH_LONG).show();
                return true;
            case R.id.action_devinfo:
                Toast.makeText(getApplicationContext(),"Dev info",Toast.LENGTH_LONG).show();
                return true;
            case R.id.refresh:
                refresh_list(class_id);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    void logoutUser() {
        session.setLogin(false);
        db.deleteUsers();
        // Launching the login activity
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }

    // refresh list
    public void refresh_list(String id) {
        // this method refresh list and get the json data
        listItems.clear();
        // adapter = new MyAdapter(listItems,getApplicationContext());
        recyclerView.setAdapter(attendanceAdapter);

        recyclerView.setItemAnimator(new DefaultItemAnimator());
        progressDialog.setMessage("Loading");
        progressDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.GET, ApiConfig.URL_TEACHER_ATTENDANCE+id, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                progressDialog.dismiss();
                try {

                    progressDialog.hide();
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("Data");  // finding data
                    Log.d(TAG, String.valueOf(jsonObject));

                    int len = jsonArray.length();
                    for (int i = 0; i < len; i++) {
                        JSONObject o = jsonArray.getJSONObject(i);
                        AttendanceModel item = new AttendanceModel(
                                o.getString("id"),
                                o.getString("name"),
                                o.getString("roll"),
                                o.getString("class_id"),
                                o.getString("status"),
                                null
                        );
                        listItems.add(item);

                        //adapter = new MyAdapter(listItems,getApplicationContext());
                        recyclerView.setAdapter(attendanceAdapter);   // setting them in list view

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressDialog.hide();
                Toast.makeText(TeacherAttendanceActivity.this, "Failed", Toast.LENGTH_SHORT).show();
            }
        }) {
            /** Passing some request headers* */
            @Override
            public Map getHeaders() throws AuthFailureError {

                SQLiteHandler db = new SQLiteHandler(getApplicationContext());
                HashMap<String,String> userDetail= db.getUserDetails();
                String userToken = userDetail.get("token");
                Log.d(TAG, String.valueOf(userToken));
                HashMap headers = new HashMap();
                headers.put("Accept", "application/json");
                headers.put("Authorization", "Bearer "+userToken);
                return headers;
            }
        };
        stringRequest.setShouldCache(false);
        VolleyRequest.getInstance(TeacherAttendanceActivity.this).addToRequestQueue(stringRequest);
    }

    // take attendance
    private void request( final String classId,final String date,final String data ) {

        progressDialog.setMessage("Taking attendance");
        showDialog();

        StringRequest strReq = new StringRequest(Request.Method.POST,
                ApiConfig.URL_TEACHER_ATTENDANCE_STORE, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Login Response: " + response);
                hideDialog();
                try {
                    JSONObject jObj = new JSONObject(response);
                    boolean error = jObj.getBoolean("error");

                    // Check for error node in json
                    if (!error) {
                        String attendance = jObj.getString("Attendance");
                        Toast.makeText(TeacherAttendanceActivity.this, attendance, Toast.LENGTH_LONG).show();
                        finish();

                    } else {
                        // Error in login. Get the error message
                        String errorMsg = jObj.getString("message");
                        Toast.makeText(TeacherAttendanceActivity.this,
                                errorMsg, Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    // JSON error
                    e.printStackTrace();
                    Toast.makeText(TeacherAttendanceActivity.this, "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Login Error: " + error.getMessage());
                Toast.makeText(TeacherAttendanceActivity.this,
                        error.getMessage(), Toast.LENGTH_LONG).show();
                hideDialog();
            }
        }) {

            /** Passing some request headers* */
            @Override
            public Map getHeaders() throws AuthFailureError {

                SQLiteHandler db = new SQLiteHandler(TeacherAttendanceActivity.this);
                HashMap<String,String> userDetail= db.getUserDetails();
                String userToken = userDetail.get("token");
                Log.d(TAG, String.valueOf(userToken));
                HashMap headers = new HashMap();
                headers.put("Accept", "application/json");
                headers.put("Authorization", "Bearer "+userToken);
                return headers;
            }

            @Override
            protected Map<String, String> getParams() {
                // Posting parameters to login url
                Map<String, String> params = new HashMap<String, String>();
                params.put("class_id", classId);
                params.put("date", date);
                params.put("data", data);

                return params;
            }

        };
        strReq.setShouldCache(false);
        // Adding request to request queue
        VolleyRequest.getInstance(TeacherAttendanceActivity.this).addToRequestQueue(strReq);
    }
    private void showDialog() {
        if (!progressDialog.isShowing())
            progressDialog.show();
    }

    private void hideDialog() {
        if (progressDialog.isShowing())
            progressDialog.dismiss();
    }


}

模型类'方便模型类'

public class AttendanceModel {
    String id,name,roll,classId,previousAttendance,attendance;


    public AttendanceModel(String id, String name,String roll, String classId,String previousAttendance,String attedance ){
        this.id = id;
        this.name = name;
        this.classId =classId;
        this.roll=roll;
        this.attendance=attedance;
        this.previousAttendance=previousAttendance;
    }

    public String getAttendance() {
        return attendance;
    }

    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getRoll() {
        return roll;
    }
    public String getClassId() {
        return classId;
    }
    public String getPreviousAttendance(){return previousAttendance;}

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setRoll(String roll) {
        this.roll = roll;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }

    public void setPreviousAttendance(String previousAttendance) {
        this.previousAttendance = previousAttendance;
    }

    public void setAttendance(String attendance) {
        this.attendance = attendance;
    }

 
}

适配器类'适配器类'

public class AttendanceAdapter extends RecyclerView.Adapter<AttendanceAdapter.ViewHolder>  implements Filterable

{
    // date
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String currentDateandTime = sdf.format(new Date());

    private static final String TAG = AttendanceAdapter.class.getSimpleName();


    public static List<AttendanceModel> listItems;
    private List<AttendanceModel> listItemsFiltered;
    private Context context;
    private ProgressDialog dialog;
    private AttendanceAdapter.AttendanceAdapterListner listner;

    private ProgressDialog pDialog;
    private SQLiteHandler db;
    public static JSONObject jo = new JSONObject();
    public static JSONArray ja  = new JSONArray();




    public AttendanceAdapter(List<AttendanceModel> listItems, Context context, AttendanceAdapter.AttendanceAdapterListner listner) {
        this.listItems = listItems;
        this.listner=listner;
        this.context = context;
        this.listItemsFiltered =listItems;

        // SqLite database handler
        db = new SQLiteHandler(context);

        // Progress dialog
        pDialog = new ProgressDialog(context);


    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    listItemsFiltered = listItems;
                } else {
                    List<AttendanceModel> filteredList = new ArrayList<>();
                    for (AttendanceModel row : listItems) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getName().toUpperCase().contains(charSequence.toString().toUpperCase())||row.getName().toLowerCase().contains(charSequence.toString().toLowerCase())) {

                            filteredList.add(row);
                        }
                    }

                    listItemsFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = listItemsFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                listItemsFiltered = (ArrayList<AttendanceModel>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView name;
        public TextView roll;
        public TextView previous;

        RadioGroup radioAttendance;
        RadioButton radioAttendancePresent,radioAttendanceAbsent;


        public CardView card_view;


        public ViewHolder(View itemView) {
            super(itemView);
            name= (TextView) itemView.findViewById(R.id.textViewAttendanceStudentName);
            roll = (TextView) itemView.findViewById(R.id.textViewAttendanceStudentRoll);
            previous = (TextView) itemView.findViewById(R.id.textViewAttendanceStudentPreviousStatus);
            radioAttendance = itemView.findViewById(R.id.radioAttendance);
            radioAttendancePresent =itemView.findViewById(R.id.radioAttendancePresent);
            radioAttendanceAbsent =itemView.findViewById(R.id.radioAttendanceAbsent);

            //card_view = (CardView) itemView.findViewById(R.id.class_card_view); // card view for on click method
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick( View view) {
                    // send selected contact in callback
                    listner.onAttendanceAdapterSelected(listItemsFiltered.get(getAdapterPosition()));  // selecting cardview and position (model)
                }
            });
            radioAttendance.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup radioGroup, int i) {
                    //Toast.makeText(TeacherAttendanceActivity.this, toString(i), Toast.LENGTH_SHORT).show();
                    // Toast.makeText(context,"clicked at position"+i+" "+id+""+name,Toast.LENGTH_SHORT).show();

                    if(radioAttendancePresent.isChecked())
                    {
                        listItems.get(getAdapterPosition()).setAttendance("present");


                    }
                    else {
                        listItems.get(getAdapterPosition()).setAttendance("absent");

                    }

                }
            });


        }


    }


    @Override
    public AttendanceAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.attendance_list, parent, false);
        return new AttendanceAdapter.ViewHolder(v);
    }

    @Override
    public void onBindViewHolder  (final AttendanceAdapter.ViewHolder holder, final int position) {
        final AttendanceModel listItem = listItemsFiltered.get(position);

        holder.name.setText(listItem.getName());
        holder.roll.setText(listItem.getRoll());
        holder.previous.setText(listItem.getPreviousAttendance());
 
      
    }

    public interface AttendanceAdapterListner {
        void onAttendanceAdapterSelected(AttendanceModel model);  // sending cardview to say the dialoge and model for sending context
    }

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

    private void showDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hideDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }
}

您必须根据模型状态初始化RadioButton ,如下所示:

@Override
public void onBindViewHolder  (final AttendanceAdapter.ViewHolder holder, final int position) {
    final AttendanceModel listItem = listItemsFiltered.get(position);

    holder.name.setText(listItem.getName());
    holder.roll.setText(listItem.getRoll());
    holder.previous.setText(listItem.getPreviousAttendance());

    final String id =listItem.getId();
    final String class_id =listItem.getClassId();


    holder.radioAttendance.setOnCheckedChangeListener(null);
    if(listItem.getAttendance().equalsIgnoreCase("present")) {
        radioAttendancePresent.setChecked(true);
    } else {
        radioAttendancePresent.setChecked(false);
    }

    //Add listener here and remove from holder
    holder.radioAttendance.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            if(holder.radioAttendancePresent.isChecked()) {
                listItemsFiltered.get(position).setAttendance("present");
            } else {
                listItemsFiltered.get(position).setAttendance("absent");
            }

            notifyDataSetChanged();
        }
    });
}

您的问题将通过对您的 Recycler 视图适配器进行小的更改来解决,请不要禁用可回收属性,这会使您的 Recycler 视图成为一个美化的列表视图。

我可以看到您尝试使用稀疏布尔数组来保存单选按钮的状态,这很好,但您也不需要它。 使用稀疏布尔数组的想法是在回收器视图中保留每个项目的状态,以便在回收它们时您仍然可以参考每个项目的状态。

在适配器的时候已经拥有的东西,我们可以用它来知州,即attendance模型的属性,在这种情况下,你可以通过检查出勤属性设为您的复选框的状态presentabsent

关于您的代码的另一件事是您使用onCheckChangedListener作为单选按钮的单击事件处理程序,您不应该使用它,因为它响应所有检查更改的事件,即使它是从代码而不是从用户操作触发的,因此,当您绑定视图并将任何单选按钮设置为选中或未选中时,它会调用此回调。

这是您的 ViewHolder 类的修改版本,它通过应用上述解决方案解决了这个问题。

 public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView name;
    public TextView roll;
    public TextView previous;

    RadioGroup radioAttendance;
    RadioButton radioAttendancePresent, radioAttendanceAbsent;


    public CardView card_view;


    public ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.textViewAttendanceStudentName);
        roll = (TextView) itemView.findViewById(R.id.textViewAttendanceStudentRoll);
        previous = (TextView) itemView.findViewById(R.id.textViewAttendanceStudentPreviousStatus);
        radioAttendance = itemView.findViewById(R.id.radioAttendance);
        radioAttendancePresent = itemView.findViewById(R.id.radioAttendancePresent);
        radioAttendanceAbsent = itemView.findViewById(R.id.radioAttendanceAbsent);

        radioAttendancePresent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                radioAttendancePresent.setChecked(true);
                listItems.get(getAdapterPosition()).setAttendance("present");
            }
        });

        radioAttendanceAbsent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                radioAttendanceAbsent.setChecked(true);
                listItems.get(getAdapterPosition()).setAttendance("absent");
            }
        });

    }

    void bind(int position) {
        // use the sparse boolean array to check
        if (listItems.get(position).getAttendance() != null) {
            if (listItems.get(position).getAttendance().equals("present")) {
                radioAttendancePresent.setChecked(true);
            } else if (listItems.get(position).getAttendance().equals("absent")) {
                radioAttendanceAbsent.setChecked(true);
            }
        } else {
            radioAttendance.clearCheck();
        }

        name.setText(listItems.get(position).getName());
        roll.setText(listItems.get(position).getRoll());
        previous.setText(listItems.get(position).getPreviousAttendance());
    }
}

请注意,我们为每个单选按钮设置了单独的单击侦听器,并在项目列表中设置状态,并在绑定时检查该状态,我们还删除了onCheckChangedListener和稀疏布尔数组,最后一件事是我们确保当没有为出勤属性设置状态时,我们只需清除单选按钮,以便没有人被选中,代码更简单并且现在可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM