我对android开发相当陌生,并开始了一个小应用程序项目。现在我有一个问题,我似乎无法独自解决,在搜索中找不到解决方案。所以我希望您能对我有个建议:)
我有一个带有这样的模板的ListView:
<Switch
android:id="@+id/trackingSwitch"
android:layout_columnSpan="1"
android:layout_alignParentLeft="true"
android:layout_row="0"
android:layout_column="0" />
<TextView
android:id="@+id/tvName"
android:layout_columnSpan="1"
android:text="Name"
android:textColor="#545454"
android:textSize="20dp"
android:layout_marginLeft="10dp"
android:layout_gravity="fill_horizontal"
android:layout_row="0"
android:layout_column="1" />
<TextView
android:id="@+id/tvTime"
android:layout_columnSpan="1"
android:text="Time"
android:textSize="15dp"
android:textStyle="italic"
android:layout_marginLeft="10dp"
android:layout_gravity="fill_horizontal"
android:layout_row="1"
android:layout_column="1" />
</GridLayout>
它工作得很好,给了我一个“切换按钮”和两个“文本”字段。现在我想用对象数据填充它,因此我扩展了一个ArrayAdapter并将其放在getView()中:
@Override
public View getView(int position, View view, ViewGroup parent) {
// Get the data item for this position
final AniTracking aniTracking = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
if (view == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.tracking_list, parent, false);
}
// Lookup view for data population
Switch swActive = (Switch) view.findViewById(R.id.trackingSwitch);
TextView tvName = (TextView) view.findViewById(R.id.tvName);
TextView tvTime = (TextView) view.findViewById(R.id.tvTime);
// Populate the data into the template view using the data object
swActive.setChecked(aniTracking.isActive());
tvName.setText(aniTracking.getName());
tvTime.setText(aniTracking.getCurrentTrackingTime());
// attach listener to switch
swActive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean newStatus) {
// switch set to active? start new AniTrackingPart
if (newStatus == true) {
AniTrackingPart aniTrackingPart = new AniTrackingPart();
aniTrackingPart.setStartTime(new DateTime());
AniTrackingManager.getInstance(getContext()).addAniTrackingPart(aniTracking, aniTrackingPart);
}
// set to inactive -> close current AniTrackingPart
else {
AniTrackingManager.getInstance(getContext()).closeActiveTrackingPart(aniTracking);
}
}
});
// Return the completed view to render on screen
return view;
}
我的问题是onCheckedChange侦听器。当我添加它时,开关的行为很奇怪,给每个项目都设置为true。我注意到一个位置多次调用getView()方法,我需要自己关心吗?我也有一种感觉,当我填充position2的数据(swActive.setChecked(aniTracking.isActive()))时,可能会触发position1的侦听器,这可能吗?
感谢您提供的所有帮助,这使我的工作停止了几天。
祝你有美好的一天,阿妮
编辑以澄清不是重复的问题:如果不会多次调用getView(),也会出现此问题。在ListView中为每个项目调用它时,对位置> 1的调用已经触发了我的侦听器,并给了我错误的结果。
您的第一个问题是弄清楚为什么您notifyDataSetChanged
被这么多次打电话。这将触发所有可见视图的getView。
您的第二个问题,setChecked
将触发您的setOnCheckedChangeListener
您可以通过使用以下方法setOnClickListener
来避免这种情况:
switch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (switch.isChecked()) {
} else {
}
}
});
以确保仅在被触摸时才调用它,而不是由用户界面引起的更改调用。
(您还需要将开关更改为final Switch
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句