Android:带图像的 ListViews 的 Vogella 上下文操作模式

标签 android android-listview android-arrayadapter

我从这里开始关注 Vogella 关于 ListView 的上下文操作模式的教程 http://www.vogella.com/articles/AndroidListView/article.html .

反正我想做的有点不一样。本教程中使用的数据是经过初始化的字符串数组。但是我的数据是从数据库中检索到的对象列表。我怎样才能做到这一点?在此先感谢您的帮助

这里是名为 MyPerformanceArrayAdapter.java 的自定义 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;
     }
    }   

这是初始化字符串数据的 Activity 代码

    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();
      }

     } 

最佳答案

您的适配器类...

public class MyPerformanceArrayAdapter extends ArrayAdapter<String>

应该是……

public class MyPerformanceArrayAdapter extends ArrayAdapter<T> 

其中 T 是列表对象,而不是字符串。

这可能有帮助:ListView with objects tutorial

关于Android:带图像的 ListViews 的 Vogella 上下文操作模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704846/

相关文章:

android - 读取其他应用程序android的偏好

java - Android SQLite - 尝试访问单行时出现 NullPointerException 但可以访问整个数据吗?

android - 升序排列的位置列表

android - ListView 自定义适配器随机检查值

android - 将 ListView 项目放在可见区域的中心

android - React Native - 为什么我的项目文件夹占用了这么多空间?

android - 如何将图像(字节数组)从 JSON 显示到 imageView 中...工厂返回 null

android - 我的 ListView 有两种类型的 View 。如何管理?

java - 如何在 Android 中的 ListView 项目之前添加数字

Android 自定义微调适配器不显示内容