我正在使用Android Studio使用java创建应用程序,但我相当新,我的大多数经验都是使用C#和Winforms的Visual Studio。
目前我有一个带CheckBoxes的ListView,我使用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()会返回正确的值但是当应用程序尝试检查框时应用程序崩溃。我在网上找到的所有答案对于这么简单的任务来说似乎过于复杂。有没有简单明了的方法可以查看盒子&#34; Bravo&#34;和&#34;达美&#34;当应用加载时,例如?
答案 0 :(得分:1)
获得一个Checkbox的真正方法需要您深入了解ListView子项,而不是适配器本身。
android - listview get item view by position
基本上,适配器只存储数据和&#34;绑定&#34;数据到视图。适配器实际上并不保存视图信息。
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));
}
的布尔列表,例如,以及更新该列表的方法。
更详细地说,这是一个想法
getView()
该适配器类的checkBox.setChecked(isChecked(position));
方法可以控制您何时通过import multiprocessing
import cv2
import os
path = r"/home/pi/Desktop/calibration.jpg"
image = cv2.imread(path)
def cvtcolor(img):
print "converting to gray ..."
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print "converted to gray"
if True:
p = multiprocessing.Process(name='test',
target=cvtcolor,
kwargs={'img':image}
)
p.start()
p2 = multiprocessing.Process(name='test',
target=cvtcolor,
kwargs={'img':image}
)
p2.start()
最后,您不会在应用加载时设置框,而是在初始化适配器时设置框。