1

ここhttp://www.vogella.com/articles/AndroidListView/article.htmlから ListViews のコンテキスト アクション モードに関する Vogella のチュートリアルに従いました。

とにかく、やりたいことがちょっと違う。チュートリアルで使用されるデータは、文字列の初期化された配列です。しかし、My Data はデータベースから取得したオブジェクトのリストです。どうやってやるの?助けてくれてありがとう

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

これは、文字列データが初期化されるアクティビティのコードです

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

     } 
4

3 に答える 3

1

データベースから取得するオブジェクトのリスト。ArrayList<E>

次にアダプターを渡し、ArrayList<E>それに応じてアダプターを変更して、ArrayList<E>代わりに渡すString[] array

于 2013-10-31T11:15:10.933 に答える
1

あなたのアダプタークラス...

public class MyPerformanceArrayAdapter extends ArrayAdapter<String>

する必要があります...

public class MyPerformanceArrayAdapter extends ArrayAdapter<T> 

ここで、T は文字列ではなくリスト オブジェクトです。

これは役立つかもしれません: ListView with objects チュートリアル

于 2013-11-01T02:10:02.583 に答える
0

データベースから取得したオブジェクトを簡単にリストに入れ、カスタム ArrayAdapter を作成できます。たとえば、リストビューに表示されるオブジェクトのリスト (私の second-android-project の一部なので、データの変更と少し絡み合っています (スキーム リストは冗長です))

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

}

}

アクティビティの 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

于 2013-11-01T09:37:58.200 に答える