2

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

但是,我不需要这么复杂。我只需要TextView在某些列表项上方插入一个简单的。所以我试着getViewBaseAdapter

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 个项目。

我究竟做错了什么?

4

2 回答 2

1

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

你应该做的是

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

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

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

listView.addHeaderView(v);

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

于 2014-05-28T16:16:10.463 回答
0

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;
}
于 2014-05-28T16:21:33.323 回答