导航抽屉 - 具有可扩展列表视图的ImageView问题

时间:2014-07-13 14:46:24

标签: android listview imageview

我的可展开列表视图存在问题。这是我第一次实施它。所以,这就是问题所在:

我有一个由2个GroupView组成的导航抽屉: - 第一元素 - 第二元素

每个GroupView都由一个数据列表组成。当我单击第二个元素时,可展开列表会显示具有特定图像的数据列表。当我单击第一个元素时,可展开列表会显示一个包含另一个特定图像的数据列表,也可能是它。

  

这是问题所在:

     

当我点击第二个元素然后点击第一个元素时,第一个元素中的一些数据会获取第二个元素中列表数据的图像!

我希望当我点击第二个元素时,可扩展列表必须显示一个具有特定图像的数据列表,当我点击第一个元素时,我设置e,可扩展列表必须显示另一个数据列表与我设置的另一个图像。

这是CustomAdapter.class和ViewHolder类中的两个方法:

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

    if (convertView == null) {
        convertView = LayoutInflater.from(act).inflate(R.layout.custom_list_view, null);

    }

    TextView transportName = (TextView) convertView.findViewById(R.id.parentTitle);
    ImageView transportIcon = (ImageView) convertView.findViewById(R.id.parentIcon);

    transportName.setText(getGroup(groupPosition).getServiceName());
    transportIcon.setImageResource(getGroup(groupPosition).getIcon());


    return convertView;
}

@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    ViewHolder viewHolder = null;
        if(convertView == null)
        {
            convertView = LayoutInflater.from(act).inflate(R.layout.custom_list_view_child, null);
            viewHolder = new ViewHolder();

            viewHolder.lineName =(TextView) convertView.findViewById(R.id.txtLineNameNavDrawer);
            viewHolder.lineDesc = (TextView) convertView.findViewById(R.id.txtLineDescNavDrawer);
            viewHolder.check = (CheckBox) convertView.findViewById(R.id.checkLineNavDrawer);
            viewHolder.icon = (ImageView) convertView.findViewById(R.id.imgLineNavDrawer);

            viewHolder.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer)buttonView.getTag();
                    getChild(groupPosition, getPosition).setChecked(buttonView.isChecked());

                }
            });

            convertView.setTag(viewHolder);
            convertView.setTag(R.id.checkLineNavDrawer, viewHolder.check);
        }
        else
        {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        if(getChild(groupPosition, childPosition).getLinename().equals("Mostra aree di sosta"))
        {
            viewHolder.icon.setImageResource(R.drawable.parking);
        }
        else if(getChild(groupPosition, childPosition).getLinename().equals("Mostra bike sharing"))
        {
            viewHolder.icon.setImageResource(R.drawable.ic_bike);
        }
        else if(getChild(groupPosition, childPosition).getLinename().equals("Mostra rivenditori"))
        {
            viewHolder.icon.setImageResource(R.drawable.ic_ticket);
        }
        viewHolder.check.setTag(childPosition);
        viewHolder.lineName.setText(getChild(groupPosition, childPosition).getLinename());
        viewHolder.lineDesc.setText(getChild(groupPosition, childPosition).getDescription());
        viewHolder.check.setChecked(getChild(groupPosition, childPosition).isChecked());

    return convertView;
}

 class ViewHolder { 
     TextView lineName; 
     TextView lineDesc; 
     ImageView icon;
     CheckBox check;
};

父母的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/GroupLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/row_highlighter"
android:padding="5dp" >

<ImageView
    android:id="@+id/parentIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ic_launcher" />

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical" >

    <TextView
        android:id="@+id/parentTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="@string/app_name" />
</RelativeLayout>

</LinearLayout>

孩子的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ChildLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp" >

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight=".15"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imgLineNavDrawer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/apiedi" />

</LinearLayout>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight=".7"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/txtLineNameNavDrawer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/txtLineDescNavDrawer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight=".15" >

    <CheckBox
        android:id="@+id/checkLineNavDrawer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

屏幕:

第二组视图:http://i60.tinypic.com/ogjius.png

第一组视图:http://i61.tinypic.com/2ajtjdw.png

如果有人可以帮助我,我会很感激。

1 个答案:

答案 0 :(得分:1)

您的setOnCheckedChangeListener存在问题。您只能在convertView == null时实例化它。这意味着每当convertView != null重新使用原始setOnCheckedChangeListener时,可能会或可能不会使用相同的组位置编号。

相反,始终设置新的setOnCheckedChangeListener。 converView是否为null。就像使用viewHolder.icon.setImageResource调用一样。

您还在convertView的标签中存储了两件事。使用ViewHolder时,无需将R.id.checkLineNavDrawer直接存储为标记

知道了。你需要一个其他的图像。因此,如果getLinename()。equals(&#34; blah&#34;)都不起作用,您可以将其设置为行走人图像。