我从Vogella那里学习了关于ListViews的上下文动作模式的教程http://www.vogella.com/articles/AndroidListView/article.html。
无论如何,我想做的事情有点不同。本教程中使用的数据是字符串的初始化数组。但是我的数据是从数据库中检索的对象列表。我怎样才能做到这一点?在此先感谢您的帮助
以下是名为MyPerformanceArrayAdapter.java的Custom ArrayAdapter的编码
package de.vogella.android.listactivity;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyPerformanceArrayAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] names;
static class ViewHolder {
public TextView text;
public ImageView image;
}
public MyPerformanceArrayAdapter(Activity context, String[] names) {
super(context, R.layout.rowlayout, names);
this.context = context;
this.names = names;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.rowlayout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.ImageView01);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
String s = names[position];
holder.text.setText(s);
if (s.startsWith("Windows7") || s.startsWith("iPhone")
|| s.startsWith("Solaris")) {
holder.image.setImageResource(R.drawable.no);
} else {
holder.image.setImageResource(R.drawable.ok);
}
return rowView;
}
}
这是String数据初始化的活动代码
public class MyListActivityActionbar extends ListActivity {
protected Object mActionMode;
public int selectedItem = -1;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
"Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux",
"OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values);
setListAdapter(adapter);
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
if (mActionMode != null) {
return false;
}
selectedItem = position;
// start the CAB using the ActionMode.Callback defined above
mActionMode = MyListActivityActionbar.this
.startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
}
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
// called when the action mode is created; startActionMode() was called
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
// assumes that you have "contexual.xml" menu resources
inflater.inflate(R.menu.rowselection, menu);
return true;
}
// the following method is called each time
// the action mode is shown. Always called after
// onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// called when the user selects a contextual menu item
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menuitem1_show:
show();
// the Action was executed, close the CAB
mode.finish();
return true;
default:
return false;
}
}
// called when the user exits the action mode
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
selectedItem = -1;
}
};
private void show() {
Toast.makeText(MyListActivityActionbar.this,
String.valueOf(selectedItem), Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:1)
您从数据库获取的对象列表,将其放在ArrayList<E>
接下来传递ArrayList<E>
并相应地更改适配器以传递ArrayList<E>
而不是String[] array
答案 1 :(得分:0)
您的适配器类......
public class MyPerformanceArrayAdapter extends ArrayAdapter<String>
应该是......
public class MyPerformanceArrayAdapter extends ArrayAdapter<T>
其中T是列表对象,而不是字符串。
这可能会有所帮助:ListView with objects tutorial
答案 2 :(得分:0)
您可以轻松地列出从数据库中检索的列表对象,然后创建自定义ArrayAdapter。例如,列表视图中显示的对象列表(我的第二个android项目的一部分,因此它与数据更改有点混乱(方案列表是多余的))
class SchemeAdapter extends ArrayAdapter<Storable> {
private final transient List<Storable> schemes;
private final transient int layout;
public SchemeAdapter(final Context context, final List<Storable> objects) {
super(context, R.layout.list_row_choose_schedule,
R.id.list_row_name_of_schedule, objects);
layout = R.layout.list_row_choose_schedule;
this.schemes = objects;
}
@Override
public View getView(final int position, final View convertView,
final ViewGroup parent) {
final View row = (convertView == null) ? getLayoutInflater()
.inflate(layout, parent, false) : convertView;
final TextView name = (TextView) row
.findViewById(R.id.list_row_name_of_schedule);
//can be replaced with (Scheme) getItem(position) or sth like that
final Scheme Scheme = (Scheme) schemes.get(position);
name.setText(Scheme.getName());
return row;
}
}
}
在Activity的onCreate(完整活动代码http://pastebin.com/3vj12USr)中创建:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_scheme);
final RunSource datasource = RunSource.getInstance(this);
datasource.open();
final Scheme scheme = new Scheme();
schemes = datasource.getStorableList(scheme);
schemes.add(0, scheme);
setListAdapter(new SchemeAdapter(this, schemes));
}
从数据库中检索项目列表,如下所示:
public List<Storable> getStorableList(final Storable storable) {
final List<Storable> list = new ArrayList<Storable>();
final Cursor cursor = database.query(storable.getTableName(),
storable.getColNames(), null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
final Storable run = storable.get(cursor);
list.add(run);
cursor.moveToNext();
}
cursor.close();
return list;
}
RunSource代码在这里:http://pastebin.com/xpFdcBvK