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.