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