【问题标题】:Change text of certain ListView items更改某些 ListView 项的文本
【发布时间】:2014-05-28 16:12:19
【问题描述】:

我知道有多个 ListView 项目具有强大的列表视图,可以显示可爱的标题。

但是,我不需要这么复杂。我只需要在某些列表项上方插入一个简单的TextView。所以我尝试在BaseAdaptergetView方法中做到这一点

public View getView(final int position, View convertView, final ViewGroup parent) {

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listitem, null);

            //set title accordingly
            if (position == 0 ) {
                //insert some text here
            }

            Log.d(TAG, "getView position = " + position);
        }

        TextView txt = (TextView) convertView.findViewById(R.id.sometextview);        
        txt.setText("some text comes here");

        return convertView;
    }

然而,虽然这段代码应该只更改第一项的文本,但它也会随机更改另一项的文本。列表中有大约 20 项。

我做错了什么?

【问题讨论】:

    标签: android android-listview baseadapter getview


    【解决方案1】:

    您忽略了视图回收 - 当您滚动时,您添加文本的特定视图正在列表下方使用,因为它已被回收。

    你应该做的是

    if (position == 0 ) {
        //add the text
    } else {
        //remove the text
    }
    

    为了澄清,您应该在 convertView==null if 语句之外执行此操作 - 它应该发生在每个 getView 上,而不仅仅是在创建新视图时。

    编辑:想想看,如果你只需要在第一个项目上方的文字,为什么不使用

    listView.addHeaderView(v);
    

    它可能会给你你需要的东西。

    【讨论】:

    • 把它放在外面,但随机仍然发生。我将文本更改为第一个项目,然后随机更改为其他项目。
    • 由于所有内容都被回收,您必须始终撤消您在else 部分中的更改。作为一般规则,`getView()' 'if' 语句中的任何代码都应该在 'else' 下具有相反的效果。
    【解决方案2】:

    ListView 项目被回收。您不能手动编辑项目,您必须编辑代表该项目的数据。您的适配器应该包含一些可以在外部修改的数据类型,然后通过调用notifyDatasetChanged(),列表视图将适当地重绘。

    须藤代码:

    class MyData {
    
        String normalText;
        String overrideText;
    
    }
    
    ....
    
    public View getView(final int position, View convertView, final ViewGroup parent) {
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listitem, null);
    
            //set title accordingly
            if (position == 0 ) {
                //insert some text here
            }
    
            Log.d(TAG, "getView position = " + position);
        }
    
        MyData data = getItem(position);
    
        TextView txtExtra = (TextView) convertView.findViewById(R.id.extratextview);
        txtExtra.setVisibility(data.overrideText == null ? View.GONE : View.VISIBLE);
        txtExtra.setText(data.overrideText == null ? "" : data.overrideText);
    
        TextView txt = (TextView) convertView.findViewById(R.id.sometextview);        
        txt.setText(data.normalText);
    
        return convertView;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2020-02-12
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多