带有微调器和复选框的Android Listview
我是android开发的新手。我正在尝试创建一个列表,其中包含一个微调器、一个编辑文本和一个复选框。微调器和复选框的数据来自数据库。我有以下文件带有微调器和复选框的Android Listview,android,listview,checkbox,android-edittext,Android,Listview,Checkbox,Android Edittext,我是android开发的新手。我正在尝试创建一个列表,其中包含一个微调器、一个编辑文本和一个复选框。微调器和复选框的数据来自数据库。我有以下文件 NewTransac class which extends ListActivity { private PayDbAdapter mDbHelper; private Spinner paySpinner; private CheckBox mCheckBox; @Override protected void onCreate(Bundle
NewTransac class which extends ListActivity {
private PayDbAdapter mDbHelper;
private Spinner paySpinner;
private CheckBox mCheckBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_transac_listview);
mDbHelper = new PayDbAdapter(this);
mDbHelper.open();
populatedata();
}
private void populatedata() {
paySpinner = (Spinner)findViewById(R.id.payerspinner);
mCheckBox = (CheckBox)findViewById(R.id.paidforcheckboxname);
Cursor mCursor = mDbHelper.fetchAllTransactionValue();
startManagingCursor(mCursor);
// Create an array to specify the fields we want to display in the list.
String[] from = new String[]{PayDbAdapter.KEY_NAME};
int[] to = new int[]{android.R.id.text1};
int[] cbto = new int[]{R.id.paidforcheckboxname};
// Now create a simple cursor adapter and set it to display
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mCursor, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
paySpinner.setAdapter(adapter);
SimpleCursorAdapter cbAdapter =
new SimpleCursorAdapter(this, R.layout.show_new_transac_data, mCursor, from, cbto );
setListAdapter(cbAdapter);
}
列表视图是xml
列表视图填充xml
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:text="@string/listSeparatorPay"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
/>
<Spinner android:id="@+id/payerspinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true"
android:prompt="@string/selectpayer"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/paytext"
/>
<EditText android:id="@+id/payamount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="text"
/>
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:text="@string/listSeparatorPayedFor"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
/>
<CheckBox android:id="@+id/paidforcheckboxname"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<EditText android:id="@+id/paidforamount"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
/>
问题
我根据数据库中字段的数量获得多个微调器、复选框和编辑文本。我发现我们不能像设置微调器那样为复选框设置适配器。
我只需要获得一个带有一个编辑文本和多个复选框(数据库行总数)的微调器。请帮忙 编辑-请查看评论,此解决方案可能不正确 我知道这个问题很古老,但这是Google上的第一个结果,我正在开发一个在ListView中使用微调器的应用程序。我使用了中的一些示例代码开始。我希望这个例子能回答你的问题。我没有实现复选框,但它们与微调器非常相似——事实上,要简单得多。此示例有一个带有TextView和微调器的ListView。每当用户更改微调器中的选择时,TextView都会更改以反映这一点 我将该项目分为三类:
- ListViewTestActivity-主活动
- DataAdapter-扩展ArrayAdapter并在ListView中显示元素
- DataHolder—仅保存有关元素的一些信息的简单对象。这可以通过许多其他方式来实现,以满足您的需求
- main.xml-已修改-主布局
- rowview.xml-已添加-ListView中每个元素的布局
- strings.xml-modified-默认的Android字符串文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ListView android:id="@+id/listView1" android:layout_height="match_parent" android:layout_width="match_parent" />
</LinearLayout>
这非常简单,您只需获取列表,创建一个新适配器,然后将ListView的适配器设置为您创建的适配器。这是DataHolder类:
public class DataHolder {
private int selected;
private ArrayAdapter<CharSequence> adapter;
public DataHolder(Context parent) {
adapter = ArrayAdapter.createFromResource(parent, R.array.choices, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
public ArrayAdapter<CharSequence> getAdapter() {
return adapter;
}
public String getText() {
return (String) adapter.getItem(selected);
}
public int getSelected() {
return selected;
}
public void setSelected(int selected) {
this.selected = selected;
}
}
公共类数据持有者{
选择私人int;
专用阵列适配器;
公共数据持有者(上下文父级){
adapter=ArrayAdapter.createFromResource(父项,R.array.choices,android.R.layout.simple\u微调器\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
}
公共阵列适配器getAdapter(){
返回适配器;
}
公共字符串getText(){
返回(字符串)adapter.getItem(选中);
}
public int getSelected(){
返回选中的;
}
已选择的公共无效设置(已选择整数){
this.selected=selected;
}
}
DataHolder类所做的只是保存微调器的适配器以及您可能希望为ListView中的每个条目存储的任何其他信息(例如,您可能希望存储是否选中它)。最后是应用程序真正的“肉”,DataAdapter类:
public class DataAdapter extends ArrayAdapter<DataHolder> {
private Activity myContext;
public DataAdapter(Activity context, int textViewResourceId, DataHolder[] objects) {
super(context, textViewResourceId, objects);
myContext = context;
}
// We keep this ViewHolder object to save time. It's quicker than findViewById() when repainting.
static class ViewHolder {
protected DataHolder data;
protected TextView text;
protected Spinner spin;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
// Check to see if this row has already been painted once.
if (convertView == null) {
// If it hasn't, set up everything:
LayoutInflater inflator = myContext.getLayoutInflater();
view = inflator.inflate(R.layout.rowview, null);
// Make a new ViewHolder for this row, and modify its data and spinner:
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.text);
viewHolder.data = new DataHolder(myContext);
viewHolder.spin = (Spinner) view.findViewById(R.id.spin);
viewHolder.spin.setAdapter(viewHolder.data.getAdapter());
// Used to handle events when the user changes the Spinner selection:
viewHolder.spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
viewHolder.data.setSelected(arg2);
viewHolder.text.setText(viewHolder.data.getText());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
// Update the TextView to reflect what's in the Spinner
viewHolder.text.setText(viewHolder.data.getText());
view.setTag(viewHolder);
Log.d("DBGINF", viewHolder.text.getText() + "");
} else {
view = convertView;
}
// This is what gets called every time the ListView refreshes
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(getItem(position).getText());
holder.spin.setSelection(getItem(position).getSelected());
return view;
}
}
公共类DataAdapter扩展了ArrayAdapter{
私人活动myContext;
公共数据适配器(活动上下文、int-textViewResourceId、数据持有者[]对象){
超级(上下文、textViewResourceId、对象);
myContext=上下文;
}
//我们保留此ViewHolder对象以节省时间。重新绘制时,它比findViewById()更快。
静态类视窗夹{
受保护的数据持有人数据;
受保护的文本查看文本;
受保护旋转器旋转;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=空;
//检查这一行是否已经上漆过一次。
if(convertView==null){
//如果没有,请设置所有内容:
LayoutFlater充气机=myContext.getLayoutFlater();
视图=充气机。充气(R.layout.rowview,null);
//为此行创建新的ViewHolder,并修改其数据和微调器:
最终ViewHolder ViewHolder=新的ViewHolder();
viewHolder.text=(TextView)view.findViewById(R.id.text);
viewHolder.data=新的数据持有者(myContext);
viewHolder.spin=(微调器)view.findViewById(R.id.spin);
viewHolder.spin.setAdapter(viewHolder.data.getAdapter());
//用于在用户更改微调器选择时处理事件:
viewHolder.spin.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView arg0、视图arg1、内部arg2、长arg3){
viewHolder.data.setSelected(arg2);
viewHolder.text.setText(viewHolder.data.getText());
}
@凌驾
未选择公共无效(AdapterView arg0){
}
});
//更新TextView以反映微调器中的内容
viewHolder.text.setText(viewHolder.data.getText());
view.setTag(viewHolder);
Log.d(“DBGINF”,viewHolder.text.getText()+”);
}否则{
视图=转换视图;
}
//这就是每次ListView刷新时调用的内容
ViewHolder=(ViewHolder)view.getTag();
holder.text.setText(getItem(position.getText());
holder.spin.setSelection(getItem(position.getSelected());
返回视图;
}
}
下面是最后一个应用程序的屏幕截图(虽然不太漂亮,但确实有效):
就这样!我希望我回答了你的问题,并像我一样帮助了其他偶然发现这个问题的人。如果要动态更改列表中的数据,请使用DataAdapter的add()
、remove()
、get()
和set()
方法要更改每个微调器的数据,需要修改DataHolder类。旋转
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, ListViewTestActivity!</string>
<string name="app_name">ListViewTest</string>
<string name="choice_prompt">Select a choice</string>
<string-array name="choices">
<item>Alpha</item>
<item>Bravo</item>
<item>Charlie</item>
</string-array>
</resources>
public class ListViewTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = (ListView) findViewById(R.id.listView1);
DataHolder data = new DataHolder(this);
DataHolder data1 = new DataHolder(this);
DataHolder data2 = new DataHolder(this);
DataHolder data3 = new DataHolder(this);
DataHolder data4 = new DataHolder(this);
DataAdapter d = new DataAdapter(this, R.layout.rowview, new DataHolder[] { data, data1, data2, data3, data4 });
listView.setAdapter(d);
}
}
public class DataHolder {
private int selected;
private ArrayAdapter<CharSequence> adapter;
public DataHolder(Context parent) {
adapter = ArrayAdapter.createFromResource(parent, R.array.choices, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
public ArrayAdapter<CharSequence> getAdapter() {
return adapter;
}
public String getText() {
return (String) adapter.getItem(selected);
}
public int getSelected() {
return selected;
}
public void setSelected(int selected) {
this.selected = selected;
}
}
public class DataAdapter extends ArrayAdapter<DataHolder> {
private Activity myContext;
public DataAdapter(Activity context, int textViewResourceId, DataHolder[] objects) {
super(context, textViewResourceId, objects);
myContext = context;
}
// We keep this ViewHolder object to save time. It's quicker than findViewById() when repainting.
static class ViewHolder {
protected DataHolder data;
protected TextView text;
protected Spinner spin;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
// Check to see if this row has already been painted once.
if (convertView == null) {
// If it hasn't, set up everything:
LayoutInflater inflator = myContext.getLayoutInflater();
view = inflator.inflate(R.layout.rowview, null);
// Make a new ViewHolder for this row, and modify its data and spinner:
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.text);
viewHolder.data = new DataHolder(myContext);
viewHolder.spin = (Spinner) view.findViewById(R.id.spin);
viewHolder.spin.setAdapter(viewHolder.data.getAdapter());
// Used to handle events when the user changes the Spinner selection:
viewHolder.spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
viewHolder.data.setSelected(arg2);
viewHolder.text.setText(viewHolder.data.getText());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
// Update the TextView to reflect what's in the Spinner
viewHolder.text.setText(viewHolder.data.getText());
view.setTag(viewHolder);
Log.d("DBGINF", viewHolder.text.getText() + "");
} else {
view = convertView;
}
// This is what gets called every time the ListView refreshes
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(getItem(position).getText());
holder.spin.setSelection(getItem(position).getSelected());
return view;
}
}