gpt4 book ai didi

带有 Switch onCheckedListener 的 Android ListView 很奇怪

转载 作者:行者123 更新时间:2023-11-29 19:38:30 24 4
gpt4 key购买 nike

我是 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 填充数据时,可能会触发 position1 的监听器 (swActive.setChecked(aniTracking.isActive())),这可能吗?

我感谢所有的帮助,这让我的进步停滞了几天。

祝你有美好的一天,阿尼

编辑以澄清不是重复问题:如果 getView() 不会被多次调用,该问题也会存在。当为 ListView 中的每个项目调用它时,对 position > 1 的调用已经触发了我的监听器并给我错误的结果。

最佳答案

您的第一个问题是找出为什么您的 notifyDataSetChanged 被调用这么多次。这将为所有可见 View 触发 getView。

你的第二个问题,setChecked 会触发你的setOnCheckedChangeListener

您可以通过使用 setOnClickListener 来避免这种情况:

    switch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (switch.isChecked()) {

} else {

}
}
});

确保它仅在被触摸时被调用,而不是由任何 ui 引起的变化调用。

(您还需要将开关更改为最终开关)

关于带有 Switch onCheckedListener 的 Android ListView 很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38967147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com