初始化数组列表行小部件的视图持有者 - 我的方法是错误的吗?

时间:2015-05-03 07:38:32

标签: android

我将视图持有者添加到ListView行以存储小部件。我是这样做的:

public View getView(int position, View row, ViewGroup parent) {
    // Check if an existing view is being reused, otherwise inflate the view
    if (row == null) {
        row = LayoutInflater.from(getContext()).inflate(R.layout.articles_list_row, parent, false);
        row.setTag(R.id.articles_list_row_widgets_holder, new TextListRowHolder(row));
    }

我还在读一本书,作者将其初始化为:

ViewHolder holder=(ViewHolder)row.getTag();
if (holder==null) {
    holder=new ViewHolder(row);
    row.setTag(holder);
}

以下是本书的引用:

  

如果对该行的getTag()调用返回null,我们知道我们需要   创建一个新的ViewHolder,然后我们通过setTag()附加到该行   供以后再使用。

我的方法有误吗?我假设如果row为null,则没有附加的持有者,如果已经创建了行,那么已经连接了持有者。

2 个答案:

答案 0 :(得分:1)

no_coding_knowledge是正确的,你需要钥匙才能从标签中取回持有人,因此row.getTag(R.id.articles_list_row_widgets_holder);应该是你答案的解决方案。

此外,我建议完全摆脱钥匙,因为我很确定你不需要它。 因此,只需使用row.setTag(holder)holder = row.getTag()设置/获取持有者。

如果您想使用密钥R.id.articles_list_row_widgets_holder,请参阅以下示例代码:

@Override
public View getView(int position, View row, ViewGroup parent) {
    TextListRowHolder holder = null;
    // Check if an existing view is being reused, otherwise inflate the view
    if (row == null) {
        row = LayoutInflater.from(getContext()).inflate(R.layout.articles_list_row, parent, false);
        holder = new TextListRowHolder(row);
        row.setTag(R.id.articles_list_row_widgets_holder, holder);
    } else
        holder = (TextListRowHolder)row.getTag(R.id.articles_list_row_widgets_holder);

    // do something with the holder, like holder.bind(getItem(position))...
}

答案 1 :(得分:0)

您正在使用特定键使用setTag。因此,如果你想得到它,你必须使用getTag(int key)方法来获得它。