自定义列表视图的行位置编号混淆

时间:2013-04-15 13:33:02

标签: android android-layout android-listview layout-inflater

更新 如我所知,我已将数据视图持有者添加到我的代码中,但我仍面临同样的问题。 我已经编辑了我的问题,我的代码请看一下。

我想根据行号在我的列表视图中显示2个视图。我想在第1行显示右手火车引擎,在第2行显示左手火车引擎,反之亦然。

反之亦然行视图更改我把条件和检查位置由mod%2 == 0比甚至其他奇数..但当我启动应用程序时我得到的确切左右右视图但是当我向下滚动时我得到了两个右手火车发动机排一个接一个。

这是代码

public LazyAdapter(Activity a, ArrayList<String> songsList) {
    activity = a;
    data=songsList;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
    Log.d("Listview","Count is"+data.size());
    return data.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    Log.d("position is - ", "position is "+position);
    if(position%2==0)
    {
    return 0;
    }
    else
    {
    return 1;
    }

}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    int type = getItemViewType(position);
    System.out.println("getView " + position + " " + convertView + " type = " + type);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
            case 0:
                convertView = inflater.inflate(R.layout.list_row1, null);
                holder.caption = holder.caption = ((ImageView)convertView.findViewById(R.id.train).findViewById(R.id.boogi1).findViewById(R.id.imageView1));
                break;
            case 1:
                convertView = inflater.inflate(R.layout.list_row2, null);
                holder.caption = holder.caption = ((ImageView)convertView.findViewById(R.id.train2).findViewById(R.id.boogi2).findViewById(R.id.imageView1)); 
                break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    return convertView;
}

static class ViewHolder {
    ImageView caption;

    }

List_row1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="500dp"
android:background="@drawable/list_selector"
android:orientation="horizontal"
android:padding="5dip" >
 <include android:id="@+id/mainview" layout="@layout/activity_main" />

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<HorizontalScrollView
    android:id="@+id/horizontalScrollView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <include android:id="@+id/train" layout="@layout/train" />
</HorizontalScrollView>

train.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
    <include android:id="@+id/boogi1" layout="@layout/boogi" />
    <include android:id="@+id/boogi2" layout="@layout/boogi" />
     <include android:id="@+id/engine" layout="@layout/engine" />

在Train2.xml中包含标记顺序已更改。

3 个答案:

答案 0 :(得分:1)

您没有使用View Holder来保持视图,因为当我们滚动列表持有者时,应该在那里按住inflated视图....

在给视图充气后,初始化View holder,然后在其中执行操作。

答案 1 :(得分:0)

if(convertView==null)可能会让您遇到问题。

目前,只有在convertView = null时才会检查用于检查要使用的视图的代码。在你的情况下,convertView可能不是null,因此它会重复使用相同的视图几次,直到convertView再次为null(可能是因为滚动)。

尝试将该部分退出并再次尝试。

答案 2 :(得分:0)

正如mahaveermuttha和paresh mayani建议使用viewholder和adilsoomra指出我忘了添加getViewTypeCount();它解决了我的问题