我正在开发一个app,其中有一个listView,其中包含1个显示内容的textView和一个imageView。我想要的是,当我点击listView我想用我有的刻度线图像设置imageView。它的工作正常。单击listView后,刻度标记图像将加载到我单击的listview项目上。
滚动时出现问题。当我滚动时,我可以看到下面的一些其他列表视图项目加载了刻度线。不确定图像是如何在该位置设置的。
我已经读过某个地方,当滚动listView时,视图会刷新。这会导致问题吗?
任何人都可以帮忙解决这个问题吗?我希望在我单击的listView项目上显示(加载)图像,现在是其他listView项目。
下面是xml说明listView项目
method_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/white"
android:text="This is a check box button which reacts upon the check that user clicks. I am testing it with the big string and checking how it looks" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignParentRight="true"
android:layout_marginRight="34dp" />
</RelativeLayout>
以下是课程片段的一部分:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.method_list_main);
final ListView list = (ListView)findViewById(R.id.listView1);
adapter=new MethodLazyAdapter(this,ARRAY.preparationSteps,ARRAY.timeToPrepare,ARRAY.arrowValue,noOfSteps,list);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
RelativeLayout ll = (RelativeLayout) view;
ImageView image = (ImageView)ll.findViewById(R.id.imageView2);
if(tick[position]){
tick[position] = false;
image.setImageResource(0);
}
else{
tick[position] = true;
image.setImageResource(R.drawable.select_right);
}
System.out.println("Position is: "+position);
}
});
}
最初所有tick [i]值都设置为false。
下面是适配器类的getView函数
public View getView(final int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.method_item, null);
TextView text = (TextView)vi.findViewById(R.id.textView1);
text.setText(preparationSteps\[position\]);
return vi;
}
答案 0 :(得分:2)
试试这个以获得你想要的东西
在公共区域添加此变量
public SparseBooleanArray checked = new SparseBooleanArray();
然后在onItemClick
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
boolean stat = checked.get(position, false);
checked.put(position, !stat);
adapter.setChecked();
System.out.println("Position is: "+position);
}
});
和适配器类
如果适配器不是子类,则在公共区域中添加变量
private SparseBooleanArray checked = new SparseBooleanArray();
并将此方法添加到类
public void setChecked(SparseBooleanArray ch){
checked = ch;
notifyDataSetChanged();
}
或者如果它的子类使用我们定义的cheked
变量
然后在getView
方法
public View getView(final int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.method_item, null);
TextView text = (TextView)vi.findViewById(R.id.textView1);
text.setText(preparationSteps\[position\]);
ImageView image = (ImageView)vi.findViewById(R.id.imageView2);
if(checked.get(position, false)){
image.setImageResource(0);
}
else{
image.setImageResource(R.drawable.select_right);
}
return vi;
}
如果有帮助,请告诉我。
答案 1 :(得分:0)
看看这篇文章:
android - populating ListView with data from JSONArray
原因是你正在使用转换后的视图错误。 按照帖子上的示例代码粘贴。
如果每次此问题消失时您都会给行视图充气。但不推荐这种实施方式。