3

我有自定义适配器来填充列表视图,其中包含每个项目的名称和复选框。现在我在列表顶部添加了一个按钮以启用选择所有项目,但不知何故它不起作用我无法弄清楚我错在哪里。它也没有抛出任何错误。这是我的代码。`

send_show12.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
    //              flag = !flag;
                    //lv = get
                    int size = lv.getCount();
                    `Log.d("This is count is at button listener", ""+size);

                    if(lv.isItemChecked(1)){
                        for(int i = 0; i<=size; i++){

                            lv.setItemChecked(i, true);
                        }
                    } else {
                        for(int i = 0; i<=size; i++){
                            lv.setItemChecked(i, false);
                        }
                    }
                }
            });`

帮助表示赞赏。谢谢

4

3 回答 3

3

当您使用复选框滚动列表视图时,项目的位置将发生变化,以便选中的项目可能未选中,未选中的项目可能已选中。因此,为什么所选列表项目无法正确显示。(您是否观察到此问题??)解决这个问题你必须使用 ArrayAdapter 而不是 baseAdapter。 请按照此链接解决问题。

而不是 PlanetsActivity 类使用这个类,剩下的是一样的......

public class PlanetsActivity extends Activity {

private ListView mainListView;
//private Planet[] planets;
ArrayList<Planet> planets=new ArrayList<Planet>();
private ArrayAdapter<Planet> listAdapter;

/** Called when the activity is first created. */
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Find the ListView resource.
    mainListView = (ListView) findViewById(R.id.listView1);

    // When item is tapped, toggle checked properties of CheckBox and
    // Planet.

    mainListView
            .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View item,
                        int position, long id) {
                    Planet planet = listAdapter.getItem(position);
                    planet.toggleChecked();
                    PlanetViewHolder viewHolder = (PlanetViewHolder) item
                            .getTag();
                    viewHolder.getCheckBox().setChecked(planet.isChecked());
                }
            });

    Button bt=(Button)findViewById(R.id.yourbutton);
    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            planets.clear();
            for(int i=1;i<15;i++){
                planets.add(new Planet(""+i,true));
            }

            listAdapter = new PlanetArrayAdapter(this, planets);
            mainListView.setAdapter(listAdapter);
        }
    });

    planets.add(new Planet("1", false));
    planets.add(new Planet("2", false));
    planets.add(new Planet("3", false));
    planets.add(new Planet("4", false));
    planets.add(new Planet("5", false));
    planets.add(new Planet("6", false));
    planets.add(new Planet("7", false));
    planets.add(new Planet("8", false));
    planets.add(new Planet("9", false));
    planets.add(new Planet("10", false));
    planets.add(new Planet("11", false));
    planets.add(new Planet("12", false));
    planets.add(new Planet("13", false));
    planets.add(new Planet("14", false));


    listAdapter = new PlanetArrayAdapter(this, planets);
    mainListView.setAdapter(listAdapter);
}

public Object onRetainNonConfigurationInstance() {
    return planets;
}}  
于 2013-03-08T09:09:21.020 回答
0

您正在尝试检查代表您的项目的视图。你说你有一个复选框和一个文本,所以我认为它是一个线性布局。LinearLayout 没有实现 Checkable,因此您无法检查它。

您可以实现实现 Checkable 的 LiearLayout 的子类(这不好玩,而且我见过的网络上的大多数免费解决方案要么被设计破坏,要么不完整,因此它们无法在所有情况下工作),或者您查找您的循环中 LinearLayout 内的 CheckBox。

于 2013-03-08T08:26:27.747 回答
0

我使用 HashMap 来跟踪所选项目的 id

于 2017-05-30T13:44:08.133 回答