A realização da lista de seleção única do Android

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

O efeito que o projeto precisa alcançar:

Requisitos do projeto:

Para falar brevemente sobre os requisitos do projeto, adicionar e editar cargos durante o gerenciamento de pessoal requer uma lista de seleção única de cargos. Não encontrei um controle pronto, então escrevi um sozinho.

Deixe-me falar sobre a ideia de implementação: na verdade é um ListView, o elemento da lista contém dois elementos, o primeiro é um textView, o segundo é um ImageView, o padrão é não exibir √, clique nele para exibir √.

A ideia é muito clara, mas encontrei alguns problemas durante a implementação.Depois de verificar alguns blogs, a chave é o problema de subscripting dos elementos da lista.

Realização do projeto:

Primeiro no código:

Este código é uma lista de itens:

Por estar interagindo com o segundo plano, ele precisa solicitar dados do servidor e initData realiza essa função.

Em segundo lugar, eu escolho RecyclerView, ListView também funciona, isso não é complicado. Você precisa passar as informações selecionadas para a atividade de nível superior e usar o Intent para passar o valor. Existem outros métodos, como a passagem do pacote. Isso não é emaranhado. O índice é inicializado com -1. O código está um pouco confuso, tenho que mudar isso no futuro.

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, "请选择岗位");
                }
 
        }
 
    }
}

A segunda deve ser a classe chave do adaptador. O problema encontrado é o julgamento do índice. Como essa atividade é usada para seleção e edição, o adaptador também precisa implementar o valor padrão da lista. Se for adicionado, não será exibido por padrão., Se estiver editando, você precisará exibir a postagem padrão. Portanto, o índice é crítico.

A razão pela qual o índice é tão problemático aqui é que o índice retornado por nosso back-end começa em 1, então ele precisa ser processado antes de ser transferido de volta.

 
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();
    }
 
 
}
Item de dados

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;
    }
 
}

O que escrevi aqui também é um pouco confuso e não resolvi especificamente para ter uma ideia geral.

Muito referenciado.

Acho que você gosta

Origin blog.csdn.net/az44yao/article/details/112687326
Recomendado
Clasificación