简体   繁体   English

更新listView行的文本

[英]update the text of a listView row

I want my listView to be updated after clicking on a row (or any event, but let's focus on click). 我希望在单击一行(或任何事件,但让我们集中精力单击)之后更新listView。

I did something, but it updates more than one row (maybe it updates the first visible row and the one after the last visible...). 我做了些什么,但是它更新了不止一行(也许它更新了第一行可见行,而最后一行可见行之后……)。 Here is the full code 这是完整的代码

Activity code 活动代码

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

Adapter code 适配器代码

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

} }

Please suggest what's wrong with the code. 请提出代码有什么问题。

The answer was given in the comments by I_A_Mok, but i have to add more details: 答案已在I_A_Mok的评论中给出,但我必须添加更多详细信息:

In the case of a cell, when you do an action in an "if" condition , you usually have to do the opposite in an "else" condition. 对于单元格,当您在“ if”条件下执行操作时,通常必须在“ else”条件下执行相反的操作。

In my case, after my condition where I strike through text, I had to add an else condition where I don't strike through text. 在我的情况下,在我删除文本的条件之后,我不得不添加一个我不删除文本的条件。

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

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

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