当我使用gettag

时间:2015-06-15 10:11:24

标签: java android listview android-listview

我的Android视图存在问题。我在其中使用带有项目的GridView。每个项目都有名称,按钮,描述和图标。但每个项目也有一个列表视图。当我点击按钮时,我想显示链接到该按钮的列表视图。

在启动时它可以工作,但是当我向上和向下滚动几次时,我的列表视图要么没有显示,要么显示错误的列表视图。

我已经阅读了很多其他问题和文章,但我找不到我做错的事情。

也尝试了类似的东西,但仍然给出相同的结果

if (convertView == null){             
    holder = new new ListHolder();
    convertView.setTag(holder);                                         
} 
else {
    holder = (ListHolder) convertView.getTag();               
}

getView

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ListHolder holder;
        HarmonicaItem harmonicaItem = ((MainActivity) context).getHarmonicaItems().get(position);

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

        }

        holder = new ListHolder();
        holder.logo = (ImageView) row.findViewById(R.id.logo);
        holder.line = (TextView) row.findViewById(R.id.line);
        holder.button = (Button) row.findViewById(R.id.button);
        holder.listView = (ListView) row.findViewById(R.id.subHarmonica);

        holder.logo.setImageResource(harmonicaItem.logo);
        holder.button.setText(harmonicaItem.title);
        holder.button.setOnClickListener(onClickListener);

        harmonicaItem.listView = holder.listView;
        harmonicaItem.button = holder.button;

        holder.listView.setTag(harmonicaItem);
        holder.button.setTag(harmonicaItem);

        row.setTag(holder);

        return row;
    }

Model类

static class ListHolder {
    ImageView logo;
    TextView line;
    Button button;
    ListView listView;
}

我如何检索项目

 @Override
public void onClick(View v) {
    HarmonicaItem item = (HarmonicaItem) v.getTag();
}

gridview中项目的布局:

<RelativeLayout
    android:id="@+id/buttonLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:gravity="center_vertical|left"
    android:paddingLeft="115dp"
    android:paddingRight="10dp"
    android:text="loop"
    android:textColor="@android:color/black"
    android:textStyle="bold"/>

<ImageView
    android:id="@+id/logo"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp" />

<TextView
    android:id="@+id/line"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button"
    android:layout_alignBottom="@+id/button"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@+id/logo"
    android:text="00:00"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="@android:color/black"
    android:textStyle="bold"/>
</RelativeLayout>

<ListView
    android:id="@+id/subHarmonica"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/buttonLayout"
    android:visibility="gone"/>

总结我的问题: item.listView有时为null,有时候列表视图错误。

我的目标是填写列表视图,并在单击按钮时将其显示。

我做错了什么?

修改

显然我在其他代码中犯了一个错误。当listviews重新开始时,我保存了listview。当我希望它再次显示时,它有时会采取错误的列表。所以适配器实际上没有任何问题。

2 个答案:

答案 0 :(得分:0)

Plz更新你的getView方法

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

            if (convertView == null)
            {             
                holder = new ViewHolder();

                LayoutInflater inflater = LayoutInflater.from(parent.getContext());

                convertView = inflater.inflate(R.layout.list_row, null);

            holder.logo = (ImageView) row.findViewById(R.id.logo);
            holder.line = (TextView) row.findViewById(R.id.line);
            holder.button = (Button) row.findViewById(R.id.button);
            holder.listView = (ListView)         holder.findViewById(R.id.subHarmonica); 
            holder.listView.setTag(harmonicaItem);
            holder.button.setTag(harmonicaItem);

     holder.setTag(holder);

            }

     else {
         holder = (ListHolder)row.getTag();
      }

            holder.logo.setImageResource(harmonicaItem.logo);
            holder.button.setText(harmonicaItem.title);
            holder.button.setOnClickListener(onClickListener);

            return convertView;
        }

答案 1 :(得分:0)

试试这个。您的代码中存在一些问题 你错过了其他部分 2.如果条件

,则需要在内部设置标签
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ListHolder holder;
        HarmonicaItem harmonicaItem = ((MainActivity) context).getHarmonicaItems().get(position);

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
holder = new ListHolder();
        holder.logo = (ImageView) row.findViewById(R.id.logo);
        holder.line = (TextView) row.findViewById(R.id.line);
        holder.button = (Button) row.findViewById(R.id.button);
        holder.listView = (ListView) row.findViewById(R.id.subHarmonica);
 holder.listView.setTag(harmonicaItem);
        holder.button.setTag(harmonicaItem);

 row.setTag(holder);

        }else{
holder = (ListHolder)row.getTag();
}



        holder.logo.setImageResource(harmonicaItem.logo);
        holder.button.setText(harmonicaItem.title);
        holder.button.setOnClickListener(onClickListener);






        return row;
    }

修改 我删除了2行代码

armonicaItem.listView = holder.listView;
        harmonicaItem.button = holder.button;

我认为这不是必需的。试试没有这个。