The realization of Android single-selection list

https://blog.csdn.net/YuannaY/article/details/100166315

The effect that the project needs to achieve:

Project requirements:

To briefly talk about project requirements, adding and editing positions during personnel management requires a single-selection list of positions. I didn't find a ready-made control, so I wrote one by myself.

Let me talk about the idea of ​​realization: it is actually a ListView, the list element contains two elements, the first is textView, and the second is ImageView. By default, √ is not displayed, and √ is displayed after clicking.

The idea is very clear, but I encountered some problems during the implementation. After checking some blogs, the key is the problem of subscripting of list elements.

Project realization:

First on the code:

This code is a list of items:

Because it is interacting with the background, it needs to request data from the server, and initData realizes this function.

Secondly, I choose RecyclerView, ListView also works, this is not tangled. Need to pass the selected information to the upper level activity, use Intent to realize the value transfer, other methods are also available, such as the bundle transfer value, this is not tangled. The index is initialized to -1. The code is a bit messy, I have to change this in the future.

public class JobListActivity extends BaseActivity implements View.OnClickListener {
 
    private TextView nav_title;
    private RecyclerView rv_select_job;
    private SelectListAdapter adapter;
    private List<PostBean> listdata = new ArrayList<>();
    private List<JobBean> jobBeanList = new ArrayList<>();
    private ArrayList<String> mPostIds = new ArrayList<>();
    private ArrayList<String> mPostNames = new ArrayList<>();
    private String mIndex = "-1";
    private String info;
    private ImageView back;
    private TextView add;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_job_list);
        mIndex = getIntent().getStringExtra("mIndex");
        initData();
        initView();
    }
 
    //初始化数据
    public void initData() {
         //这个使用网络请求框架请求数据,得到相关数据。
        AdminApi.getInstance().getJob().subscribe(new OriginalSubscriber<List<JobBean>>(compositeDisposable) {
 
            @Override
            public void onError(ResponseThrowable e) {
                ToastUtil.show(JobListActivity.this, e.getMsg());
            }
 
            @Override
            public void onNext(List<JobBean> jobBeans, String msg) {
                jobBeanList = jobBeans;
                if (jobBeanList != null && jobBeanList.size() > 0) {
                    for (JobBean job : jobBeanList) {
                        listdata.add(new PostBean(job.getId(), job.getName(), false));
                    }
                    mPostIds.add("-1");
                }
                adapter = new SelectListAdapter(JobListActivity.this, listdata, mPostIds);
                adapter.setmIndex(mIndex);
                rv_select_job.setAdapter(adapter);
            }
        });
 
    }
 
    public void initView()
    {
 
        nav_title=findViewById(R.id.nav_txt_title);
        nav_title.setText("选择岗位");
        findViewById(R.id.nav_img_back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JobListActivity.this.finish();
            }
        });
       
        add = findViewById(R.id.nav_btn_add);
        add.setText("确定");
        add.setVisibility(View.VISIBLE);
        add.setOnClickListener(this);
        rv_select_job=findViewById(R.id.rv_job);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        rv_select_job.setLayoutManager(linearLayoutManager);
 
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.nav_btn_add:
                if (adapter.getPostidLists() != null && adapter.getPostidLists().size() > 0) {                
                    //传值,从数据库获得的index和岗位名称信息,传到上一级Activity
                    Intent intent = new Intent();
                    intent.putExtra("mIndex", adapter.getPostidLists().get(0));
                    intent.putExtra("info", adapter.getNameLists().get(0));
                    setResult(Activity.RESULT_OK, intent);
 
                    //及时finish
                    JobListActivity.this.finish();
 
                } else {
                    ToastUtil.show(this, "请选择岗位");
                }
 
        }
 
    }
}

The second should be the key Adapter class. The problem encountered is the judgment of index. Because this activity is used for selection and editing, Adapter also needs to implement the default value of the list. If it is added, it will not be displayed by default. , If it is editing, you need to display the default post. So index is critical.

The reason why the index is so troublesome here is that the index returned by our backend starts from 1, so it needs to be processed before it can be transferred back.

 
public class SelectListAdapter extends RecyclerView.Adapter<SelectListAdapter.ViewHolder> {
    public Context mContext;
    private final int COUNT=6;
    private List<PostBean> listDataBeans;
    private ArrayList<String> postidLists = new ArrayList<>();
    int index = -1;
    private String mIndex = "-1";
    private ArrayList<String> projectIdList = new ArrayList<>();
    private ArrayList<String> nameLists = new ArrayList<>();
    private ArrayList<String> codeLists = new ArrayList<>();
 
    public SelectListAdapter(Context mContext, List<PostBean> listDataBeans, ArrayList<String> listids) {
        this.mContext = mContext;
        this.listDataBeans = listDataBeans;
        if (listids != null) {
            this.postidLists.addAll(postidLists);
        }
    }
 
    public void setmIndex(String Index) {
 
        if (!Index.equals("-1")) {
            mIndex = Index;
            index = Integer.parseInt(mIndex) - 1;
        }
    }
 
    public List<PostBean> getListDataBeans() {
        return listDataBeans;
    }
    public ArrayList<String> getProjectIdList() {
        return projectIdList;
    }
    public ArrayList<String> getPostidLists() {
        return postidLists;
    }
    public ArrayList<String> getNameLists() {
        return nameLists;
    }
    public ArrayList<String> getCodeLists() {
        return codeLists;
    }
 
 
    @Override
    public void onBindViewHolder(@NonNull SelectListAdapter.ViewHolder viewHolder, int i) {
        PostBean bean = listDataBeans.get(i);
        viewHolder.iv_check.setImageResource(R.drawable.check);
        //初始化各个集合,判断标准为index,及第一次是否选择元素,否则就不显示图片
        if (index > -1) {
            listDataBeans.get(index).setSelected(true);
            postidLists.add(index + 1 + "");
            nameLists.add(listDataBeans.get(index).getName());
            projectIdList.add(listDataBeans.get(index).getId());
            codeLists.add(listDataBeans.get(index).getCode());
        }
 
        //下标相同则显示图片
        if (postidLists.contains(bean.getId()))
        {
            viewHolder.iv_check.setVisibility(View.VISIBLE);
            if (!nameLists.contains(bean.getName())) {
                nameLists.add(bean.getName());
            }
        }
        else{
            viewHolder.iv_check.setVisibility(View.INVISIBLE);
        }
 
//根据元素的图片标志位来显示图片
        viewHolder.iv_check.setVisibility(listDataBeans.get(i).isSelected() ? View.VISIBLE : View.INVISIBLE);
 
//显示具体数值
        if (listDataBeans.get(i).getCode() != null)
            viewHolder.tv_jop.setText(listDataBeans.get(i).getCode() + "\t\t\t\t" + listDataBeans.get(i).getName());
            else
                viewHolder.tv_jop.setText(listDataBeans.get(i).getName());
 
           //刷新
        viewHolder.itemView.setOnClickListener(v->{
            //将所有集合的数据清空
            postidLists.clear();
            nameLists.clear();
            projectIdList.clear();
            codeLists.clear();
 
            //添加数据
            postidLists.add(i + 1 + "");
            nameLists.add(listDataBeans.get(i).getName());
            projectIdList.add(listDataBeans.get(i).getId());
            if (codeLists != null) {
                codeLists.add(listDataBeans.get(i).getCode());
            }
           
           //其余元素的imageView标志位为false
            for (PostBean post : listDataBeans) {
                post.setSelected(false);
            }
 
           //imageView标志位为True
            listDataBeans.get(i).setSelected(true);
 
           //刷新
            notifyDataSetChanged();
            index = -1;
        });
 
    }
 
    @NonNull
    @Override
    public SelectListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.item_job_list, viewGroup, false);
        ViewHolder holder = new ViewHolder(v);
        return holder;
    }
 
    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_jop;
        private ImageView iv_check;
 
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_jop = itemView.findViewById(R.id.tv_group);
            iv_check = itemView.findViewById(R.id.iv_check);
        }
    }
 
    @Override
    public int getItemCount() {
        if (listDataBeans == null) {
            return 0;
        }
        return listDataBeans.size();
    }
 
 
}
data item

public class PostBean {
    String id;
    String name;
    String code;
 
    boolean isSelected;
 
    public PostBean() {
 
    }
 
    public PostBean(String id, String name, boolean isSelected) {
        this.id = id;
        this.name = name;
        this.isSelected = isSelected;
    }
 
    public PostBean(String id, String name, String code, boolean isSelected) {
        this.id = id;
        this.name = name;
        this.code = code;
        this.isSelected = isSelected;
    }
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public boolean isSelected() {
        return isSelected;
    }
 
    public void setSelected(boolean selected) {
        isSelected = selected;
    }
 
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
}

What I wrote here is also a bit messy, and I haven't specifically sorted it out to get a general idea.

Referenced a lot.

Guess you like

Origin blog.csdn.net/az44yao/article/details/112687326