2017-08-24 43 views
0

我正在使用Android Studio创建一个使用java的应用程序,但我对它相当陌生,我的大部分体验都是在Visual Studio中使用C#和Winforms。如何在启动时检查特定的复选框?

目前我有一个ListView与CheckBoxes里面,我使用ArrayAdapter同步列表。

ArrayList<String> items = new ArrayList<>(); 
    items.add("Alpha"); 
    items.add("Bravo"); 
    items.add("Charlie"); 
    items.add("Delta"); 

    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.row_layout, R.id.chkText, items); 
    lv.setAdapter(adapter); 

    // Test 
    Toast.makeText(getApplicationContext(), "Count " + lv.getAdapter().getCount(), Toast.LENGTH_LONG).show(); 
    for (int j = 1; j < lv.getAdapter().getCount(); j++) 
    { 
     CheckBox cb = (CheckBox) lv.getAdapter().getItem(j); 
     cb.setChecked(true); 
    } 

getCount()会返回正确的值,但应用程序在尝试检查框时会崩溃。我在网上找到的所有答案似乎都过于复杂,因为这样一个简单的任务。有没有很好又简单的方法,例如,当应用程序加载时,我可以选中“Bravo”和“Delta”框?

+1

'lv.getAdapter()'返回一个适配器,而不是复选框。 –

+0

错过了一个部分,我的错,它现在读取: lv.getAdapter()。getItem(j); –

回答

1

获得该复选框的真正方法需要您深入ListView子级,而不是适配器本身。

android - listview get item view by position

基本上,仅适配器存储数据和“结合”的数据到视图。适配器实际上并不持有视图信息本身。

  • lv.getAdapter()回报你一个通用的,无类型Adapter<?>

  • 当你这样做lv.getAdapter().getItem(j),返回你的Object,这只能投作为一个String,因为你已经使用了ArrayAdapter<String>


更好的方式来处理这个问题,如果你犯了一个自定义类extends ArrayAdapter<String>,然后你就可以编写自己的字段来存储名为mChecked这里一个布尔值列表,例如,以及更新该列表的方法。

详细地说,这里的想法

private List<Boolean> mChecked = new ArrayList<>(); 

public void setChecked(int position, boolean checked) { 
    mChecked.set(position, checked); // Might throw out of bounds exception! 
    notifyDataSetChanged(); // Need to refresh the adapter 
} 

public boolean isChecked(int position) { 
    return mChecked.get(position); 
} 

@Override 
public void getView(...) { 
    ... 

    View rowView = ... ; 

    TextView tv = (TextView) rowView.findViewById(R.id.chkText); 
    tv.setText(getItem(position)); 
    Checkbox cb = (Checkbox) rowView.findViewById(R.id.checkbox); 
    cb.setChecked(isChecked(position)); 
} 

当你通过checkBox.setChecked(isChecked(position));

检查箱子或不到底该适配器类的getView()方法将控制,你将不会在应用程序加载时设置框,而是在您初始化适配器时。

+0

我想我对View的用途感到困惑。在你的第一种方法中,如果我能得到一个View,那真棒,但我该怎么处理它?我似乎无法发现getChild()或getItem()方法。 第二种方法,比如说我创建了一个自定义类,如果我无法使用当前适配器执行此操作,那么如何让setChecked()工作? 对不起,我对这很多新东西。一切似乎都倒退了。 –

+1

'lv.getChild()'。你会得到一些'View'对象,然后你必须为'row_layout.xml'中设置的任何复选框ID设置'findViewById'。对于第二个选项,请参阅https://guides.codepath.com/android/Using-an-ArrayAdapter-with-ListView –

相关问题