java - 更新 listView 行的文本
问题描述
我希望在单击一行(或任何事件,但让我们专注于单击)后更新我的 listView。
我做了一些事情,但它更新了不止一行(也许它更新了第一个可见行和最后一个可见行之后的行......)。这是完整的代码
活动代码
DatabaseHandler colisageBase;
ListView listView;
List<Site> sites;
String id_tournee;
SiteAdapter siteAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_site_choice);
Intent intent = getIntent();
id_tournee = intent.getStringExtra("idTourneeSelectionnee");
this.listView = findViewById(R.id.list_view_site);
this.colisageBase = new DatabaseHandler(this);
sites = colisageBase.selectAllSite(id_tournee);
siteAdapter = new SiteAdapter(SiteChoiceActivity.this, sites);
listView.setAdapter(siteAdapter);
colisageBase.closeDB();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Site selectedSite = sites.get(position);
selectedSite.setIsBarred(true);
sites.set(position, selectedSite);
siteAdapter.notifyDataSetChanged();
//goToOperationActivity(selectedSite.SiteOut());
}
});
适配器代码
public class SiteAdapter extends ArrayAdapter<Site> {
public SiteAdapter(Context context, List<Site> sites) {
super(context, 0, sites);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_site,parent, false);
}
SiteViewHolder viewHolder = (SiteViewHolder) convertView.getTag();
if(viewHolder == null){
viewHolder = new SiteViewHolder();
viewHolder.heure_supposee = convertView.findViewById(R.id.heure_supposee);
viewHolder.libelle_site = convertView.findViewById(R.id.libelle_site);
viewHolder.logo_telephone = convertView.findViewById(R.id.logo_phone);
convertView.setTag(viewHolder);
}
Site site = getItem(position);
viewHolder.heure_supposee.setText(site.getHeure_supposee());
viewHolder.libelle_site.setText(site.getLibelle_site());
viewHolder.logo_telephone.setVisibility(View.INVISIBLE);
if (site.getSur_appel().equals("O")) viewHolder.logo_telephone.setVisibility(View.VISIBLE);
if (site.isBarred()) viewHolder.libelle_site.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
return convertView;
}
@Override
public void notifyDataSetChanged()
{
super.notifyDataSetChanged();
}
private class SiteViewHolder{
public TextView heure_supposee;
public TextView libelle_site;
public ImageView logo_telephone;
}
}
请提出代码有什么问题。
解决方案
I_A_Mok 在评论中给出了答案,但我必须添加更多细节:
对于单元格,当您在“if”条件下执行操作时,通常必须在“else”条件下执行相反的操作。
就我而言,在我删除文本的条件之后,我必须添加一个不删除文本的 else 条件。
if (site.isBarred()){
viewHolder.libelle_site.setPaintFlags(viewHolder.libelle_site.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}else {
viewHolder.libelle_site.setPaintFlags(viewHolder.libelle_site.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
}
推荐阅读
- solr - Solr-Lucene 支持同一字段中的多种语言标记
- python - OpenCV中的渐变方向
- javascript - 有没有办法为浏览器指定最小和最大缩放级别?
- java - 在 Java 中创建新的自定义对象与将多个值设置为 Null 的同一对象
- java - 我在 leetcode 上让数组索引越界
- sql - 寻找不同 Oracle 类型的 NULL 值
- ios - 如何将自定义 SearchBar 放在 NavigationBar 上?
- json - 根据角度 2 中存储数组的索引更新项目属性
- netty - 来自与套接字不同源的 Netty 通道输入
- php - 使用 BETWEEN 在 MySQL 中存储为字符串的日期