2013-10-29 167 views
1

我有一个复选框传感器的简单列表,Android的多选列表中选择上滚动随机元素

如果我选择任何传感器,然后上下滚动列表,选中的传感器得到改变,有时我会看到更多的传感器检查,有时没有传感器将被检查。所有这些都是通过上下滚动列表完成的。

这是一个仍然有SAM问题的最低限度的程序:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ArrayList<String> sensors = new ArrayList<String>(); 
     SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     List<Sensor> mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); 

     for (Sensor s : mSensorList) { 
      sensors.add(s.getName()); 
     } 

     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, sensors); 

     ListView mSensorListView = ((ListView) findViewById(R.id.sensorListView)); 
     mSensorListView.setAdapter(arrayAdapter); 

     mSensorListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       CheckedTextView check = (CheckedTextView) view; 
       check.setChecked(!check.isChecked()); 

       // this only logs when I actually click on a sensor. now when I scroll. 
       Log.v("SENSOR CLICKED: ", check.getText() + " " + position); 
      } 
     }); 

    } 

} 

这里是布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

    <ListView 
     android:id="@+id/sensorListView" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_marginTop="20dp" 
     android:layout_height="300dp" 
     android:background="#dadde0"> 

    </ListView> 

</RelativeLayout> 

任何想法我怎么能得到这个东西正常工作?

+0

退房这个答案,它可以帮助:http://stackoverflow.com/a/20171191/919216 –

回答

2

您必须创建一个自定义适配器视图持有者类与您的布局视图对象以及位置并重用它。

遵循这个例子:http://sunil-android.blogspot.in/2013/04/android-listview-checkbox-example.html

+1

要解释为什么:当你滚动列表,它回收使用的意见显示实际项目。因为它不知道你已经通过检查按钮来改变视图,它不知道回收视图需要清理。您的自定义适配器可以进行清理。 –

+0

谢谢@DaleWilson,但奇怪的是,很难创建一个简单的复选框列表视图。此外,答案中的示例本身也有很多错误和语法错误。 – zidarsk8