Android 滚动后显示乱序图像的列表视图

Android 滚动后显示乱序图像的列表视图,android,listview,android-listview,Android,Listview,Android Listview,我有一个应用程序,其中显示了具有两种不同布局的ListView。我在一个列表中有大约25个项目,初始项目按照我想要的顺序显示,但当我向下滚动时,特定行中的一些项目会相互覆盖,每次滚动时,它们的显示方式与前一个不同。图像也会被洗牌并相互覆盖 这是我的自定义适配器类:- 公共类CustomAdapterSettings扩展了BaseAdapter{ 私有静态最终整数类型\u项=0; 私有静态final int TYPE_SEPARATOR=1; 私有静态最终整数类型\最大\计数=类型\分隔符+1;

我有一个应用程序,其中显示了具有两种不同布局的ListView。我在一个列表中有大约25个项目,初始项目按照我想要的顺序显示,但当我向下滚动时,特定行中的一些项目会相互覆盖,每次滚动时,它们的显示方式与前一个不同。图像也会被洗牌并相互覆盖

这是我的自定义适配器类:-

公共类CustomAdapterSettings扩展了BaseAdapter{
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
私有静态最终整数类型\最大\计数=类型\分隔符+1;
private ArrayList arrListData=new ArrayList();
private ArrayList arrListDescription=new ArrayList();
私人充气机;
私人语境;
private TreeSet treeseparatorset=new TreeSet();
公共CustomAdapterSettings(上下文){
this.context=上下文;
layInflater=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
}
public void addItem(最终字符串数据、最终字符串描述){
arrListData.add(数据);
arrListDescription.add(说明);
notifyDataSetChanged();
}
public void addSeparatorItem(最终字符串分隔符){
arrListData.add(分隔符);
arrListDescription.add(分隔符);
//保存分隔符位置
TreeSeparatorSet.add(arrListData.size()-1);
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回树分隔符集。包含(位置)?类型\分隔符
:类型_项目;
}
@凌驾
public int getViewTypeCount(){
返回类型\最大\计数;
}
@凌驾
public int getCount(){
返回arrListData.size();
}
@凌驾
公共字符串getItem(int位置){
返回arrListData.get(位置);
}
公共字符串getItemDescription(int位置){
返回arrListDescription.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
私有静态类视图持有者{
公共文本视图电视设置分段器;
公共文本视图电视设置说明;
公共设置;
公共图像视图设置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder ViewHolder=null;
int型;
类型=getItemViewType(位置);
System.out.println(“getView”+位置+“”+转换视图
+“类型=”+类型);
if(convertView==null){
viewHolder=新的viewHolder();
开关(类型){
案例类型\u项目:
convertView=放置充气机。充气(
R.layout.layout\u设置\u列表,空);
viewHolder.tvsettingstageseper=(TextView)convertView
.findviewbyd(R.id.tvSettingsTag);
viewHolder.tvSettingsDescription=(TextView)convertView
.findViewById(R.id.TvSettings说明);
viewHolder.cbSettings=(复选框)convertView
.findviewbyd(R.id.cbSettings);
viewHolder.ivSettings=(图像视图)convertView
.findViewById(R.id.ivSettings);
打破
箱型分离器:
convertView=充气机充气(R.layout.layout_分离器,
无效);
viewHolder.tvsettingstageseper=(TextView)convertView
.findviewbyd(R.id.tv分离器);
打破
}
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
如果(类型==0){
viewHolder.tvsettingstageseper.setTextSize(
TypedValue.COMPLEX\u UNIT\u PX,
(int)(屏幕计算活动度.heightScreen*0.035));
viewHolder.tVSettingStageSeper.setPadding(0,
(int)(屏幕计算活动度.heightScreen*0.01),
(int)(屏幕计算活动度.widthScreen*0.15),0);
viewHolder.tvSettingsDescription.setPadding(0,
(int)(屏幕计算活动度。屏幕高度*0.001),
(int)(屏幕计算活动度.widthScreen*0.15),0);
RelativeLayout.LayoutParams layParams=(RelativeLayout.LayoutParams)viewHolder.ivSettings
.getLayoutParams();
layParams.setMargins(0,0,
(int)(屏幕计算活动度.widthScreen*0.045),0);
viewHolder.ivSettings.getLayoutParams().height=(int)(ScreenColutionActivity.heightScreen*0.06);
viewHolder.ivSettings.getLayoutParams().width=(int)(ScreenColutionActivity.heightScreen*0.06);
viewHolder.ivSettings.setLayoutParams(layParams);
layParams=(RelativeLayout.LayoutParams)viewHolder.cbSettings
.getLayoutParams();
layParams.setMargins(0,0,
(int)(屏幕计算活动度.widthScreen*0.03),0);
viewHolder.cbSettings.setLayoutParams(layParams);
layParams=(RelativeLayout.LayoutParams)viewHolder.tvSettingsTagSeper
.getLayoutParams();
layParams.setMargins(
(int)(屏幕计算活动度.widthScreen*0.05),0,0,
0);
viewHolder.tVSettingStageSeper.setLayoutParams(layParams);
layParams=(RelativeLayout.LayoutParams)viewHolder.tvSettingsDescription
.getLayoutParams();
layParams.setMargins(
(int)(屏幕计算活动度.widthScreen*0.05),0,0,
0);
viewHolder.tvSettingsDescription.setLayoutParams(layParams);
}否则{
RelativeLayout.LayoutParams layParams=(RelativeLayout.LayoutParams)viewHolder.TVSettingStageSeper
.getLayoutParams();
layParams.setMargins(
(int)(屏幕计算活动性.widthScreen*0.02)、0、0、,
0);
viewHolder.tVSettingStageSeper.setLayoutParams(layParams);
}
如果(类型==0){
如果(po)
public class CustomAdapterSettings extends BaseAdapter {

private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;

private ArrayList<String> arrListData = new ArrayList<String>();
private ArrayList<String> arrListDescription = new ArrayList<String>();
private LayoutInflater layInflater;
private Context context;
private TreeSet<Integer> treeSeparatorsSet = new TreeSet<Integer>();

public CustomAdapterSettings(Context context) {
    this.context = context;
    layInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public void addItem(final String data, final String description) {
    arrListData.add(data);
    arrListDescription.add(description);
    notifyDataSetChanged();
}

public void addSeparatorItem(final String seperator) {
    arrListData.add(seperator);
    arrListDescription.add(seperator);
    // save separator position
    treeSeparatorsSet.add(arrListData.size() - 1);
    notifyDataSetChanged();
}

@Override
public int getItemViewType(int position) {
    return treeSeparatorsSet.contains(position) ? TYPE_SEPARATOR
            : TYPE_ITEM;
}

@Override
public int getViewTypeCount() {
    return TYPE_MAX_COUNT;
}

@Override
public int getCount() {
    return arrListData.size();
}

@Override
public String getItem(int position) {
    return arrListData.get(position);
}

public String getItemDescription(int position) {
    return arrListDescription.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

private static class ViewHolder {
    public TextView tvSettingsTagSeper;
    public TextView tvSettingsDescription;
    public CheckBox cbSettings;
    public ImageView ivSettings;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    int type;
    type = getItemViewType(position);
    System.out.println("getView " + position + " " + convertView
            + " type = " + type);
    if (convertView == null) {
        viewHolder = new ViewHolder();
        switch (type) {
        case TYPE_ITEM:

            convertView = layInflater.inflate(
                    R.layout.layout_settings_list, null);
            viewHolder.tvSettingsTagSeper = (TextView) convertView
                    .findViewById(R.id.tvSettingsTag);
            viewHolder.tvSettingsDescription = (TextView) convertView
                    .findViewById(R.id.tvSettingsDescription);
            viewHolder.cbSettings = (CheckBox) convertView
                    .findViewById(R.id.cbSettings);
            viewHolder.ivSettings = (ImageView) convertView
                    .findViewById(R.id.ivSettings);
            break;
        case TYPE_SEPARATOR:
            convertView = layInflater.inflate(R.layout.layout_seperator,
                    null);
            viewHolder.tvSettingsTagSeper = (TextView) convertView
                    .findViewById(R.id.tvSeperator);
            break;
        }
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if (type == 0) {
        viewHolder.tvSettingsTagSeper.setTextSize(
                TypedValue.COMPLEX_UNIT_PX,
                (int) (ScreenCalculationActivity.heightScreen * 0.035));
        viewHolder.tvSettingsTagSeper.setPadding(0,
                (int) (ScreenCalculationActivity.heightScreen * 0.01),
                (int) (ScreenCalculationActivity.widthScreen * 0.15), 0);
        viewHolder.tvSettingsDescription.setPadding(0,
                (int) (ScreenCalculationActivity.heightScreen * 0.001),
                (int) (ScreenCalculationActivity.widthScreen * 0.15), 0);
        RelativeLayout.LayoutParams layParams = (RelativeLayout.LayoutParams) viewHolder.ivSettings
                .getLayoutParams();
        layParams.setMargins(0, 0,
                (int) (ScreenCalculationActivity.widthScreen * 0.045), 0);
        viewHolder.ivSettings.getLayoutParams().height = (int) (ScreenCalculationActivity.heightScreen * 0.06);

        viewHolder.ivSettings.getLayoutParams().width = (int) (ScreenCalculationActivity.heightScreen * 0.06);

        viewHolder.ivSettings.setLayoutParams(layParams);
        layParams = (RelativeLayout.LayoutParams) viewHolder.cbSettings
                .getLayoutParams();
        layParams.setMargins(0, 0,
                (int) (ScreenCalculationActivity.widthScreen * 0.03), 0);
        viewHolder.cbSettings.setLayoutParams(layParams);
        layParams = (RelativeLayout.LayoutParams) viewHolder.tvSettingsTagSeper
                .getLayoutParams();
        layParams.setMargins(
                (int) (ScreenCalculationActivity.widthScreen * 0.05), 0, 0,
                0);
        viewHolder.tvSettingsTagSeper.setLayoutParams(layParams);
        layParams = (RelativeLayout.LayoutParams) viewHolder.tvSettingsDescription
                .getLayoutParams();
        layParams.setMargins(
                (int) (ScreenCalculationActivity.widthScreen * 0.05), 0, 0,
                0);
        viewHolder.tvSettingsDescription.setLayoutParams(layParams);

    } else {
        RelativeLayout.LayoutParams layParams = (RelativeLayout.LayoutParams) viewHolder.tvSettingsTagSeper
                .getLayoutParams();
        layParams.setMargins(
                (int) (ScreenCalculationActivity.widthScreen * 0.02), 0, 0,
                0);
        viewHolder.tvSettingsTagSeper.setLayoutParams(layParams);
    }
    if (type == 0) {
        if (position == 1 || position == 2 || position == 3
                || position == 6 || position == 9 || position == 10
                || position == 12 || position == 14 || position == 16
                || position == 18 || position == 22) {
            viewHolder.ivSettings.setVisibility(View.VISIBLE);
        } else {
            viewHolder.cbSettings.setVisibility(View.VISIBLE);
        }
        viewHolder.cbSettings.setFocusable(false);
        viewHolder.cbSettings.setFocusableInTouchMode(false);
        viewHolder.ivSettings.setFocusable(false);
        viewHolder.ivSettings.setFocusableInTouchMode(false);
        if (arrListDescription.get(position) == null) {
            RelativeLayout.LayoutParams layParams = (RelativeLayout.LayoutParams) viewHolder.tvSettingsTagSeper
                    .getLayoutParams();
            layParams.addRule(RelativeLayout.CENTER_VERTICAL);
            viewHolder.tvSettingsTagSeper.setLayoutParams(layParams);
        }
        viewHolder.tvSettingsTagSeper.setText(arrListData.get(position));
        viewHolder.tvSettingsDescription.setText(arrListDescription
                .get(position));
    } else {
        viewHolder.tvSettingsTagSeper.setText(arrListData.get(position));
    }

    return convertView;
}

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relLaySettings"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/tvSettingsTag"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:textColor="@color/White"
    android:textStyle="bold"
    android:typeface="monospace" />

<TextView
    android:id="@+id/tvSettingsDescription"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tvSettingsTag"
    android:textColor="@color/LightGrey" />

<CheckBox
    android:id="@+id/cbSettings"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:visibility="gone" />

<ImageView
    android:id="@+id/ivSettings"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:src="@drawable/dropdown2"
    android:visibility="gone" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:background="@color/LightGrey"
android:clickable="false">

<TextView
    android:id="@+id/tvSeperator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:textStyle="bold"
    android:textColor="@color/Black" />
public class Item {
}

public class DataItem extends Item {
    String data;
    String description;
}

public class SeparatorItem extends Item {
    String description;
}
ArrayList<Item> list;
@Override
public int getItemViewType(int position) {
    Item item = list.get(position);
    if (item instanceof DataItem)
        return TYPE_ITEM;
    else 
        return TYPE_SEPARATOR;
}
if (position == 1 || position == 2 || position == 3
      || position == 6 || position == 9 || position == 10
      || position == 12 || position == 14 || position == 16
      || position == 18 || position == 22) {
    viewHolder.ivSettings.setVisibility(View.VISIBLE);
} else {
    viewHolder.cbSettings.setVisibility(View.VISIBLE);
}
Item item = list.get(position);
if (item.shouldDisplayIvSettings()) {
    viewHolder.ivSettings.setVisibility(View.VISIBLE);
    viewHolder.cbSettings.setVisibility(View.GONE);
} else {
    viewHolder.ivSettings.setVisibility(View.GONE);
    viewHolder.cbSettings.setVisibility(View.VISIBLE);
}
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
if (type == 0) {
if (type == TYPE_ITEM) {