1

I have been developing for over 10 years in languages other than Java. I am new to the Android world, but I'm trying to dive right in. I am trying to make a draggable list and I found the wonderful repos https://github.com/commonsguy/cwac-touchlist to do the dragging and dropping of the list items. However, I am getting an error when I am trying to @Override the drop method for the DropListener interface. It states that: "The method drop(int, int) of type new TouchListView.DropListener(){} must override a superclass method"

I tried to implement the way the demo utilizes the TouchList into my application, and I also copied the code exactly in another Action, and I'm getting the same error.

My code:

package bu.homework.shoppinglist;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

import com.commonsware.cwac.tlv.TouchListView;

public class ItemListActivity extends ListActivity {
    private static final int ACTIVITY_CREATE=0;
    private static final int ACTIVITY_EDIT=1;

    private static final int INSERT_ID = Menu.FIRST;
    private static final int DELETE_ID = Menu.FIRST + 1;

    private ItemsModel mDbHelper;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.item_list);
        mDbHelper = new ItemsModel(this);
        mDbHelper.open();
        fillList();
        TouchListView itemListView = (TouchListView) getListView();
        itemListView.setDropListener(onDrop);
        System.out.print("On Drop");
        // itemListView.setRemoveListener(onRemove);
        // registerForContextMenu(itemListView);
    }

   private TouchListView.DropListener onDrop = new TouchListView.DropListener() {
        @Override
        public void drop(int from, int to) {
            System.out.print(from);
            System.out.print(to);
        }
    };

    private TouchListView.RemoveListener onRemove = new TouchListView.RemoveListener() {
        public void remove(int which) {

        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean result = super.onCreateOptionsMenu(menu);
        menu.add(0, INSERT_ID, 0, R.string.menu_insert);
        return result;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
            case INSERT_ID:
                createItem();
                return true;
        }

        return super.onMenuItemSelected(featureId, item);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case INSERT_ID:
            createItem();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case DELETE_ID:
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                mDbHelper.deleteItem(info.id);
                fillList();
                return true;
        }
        return super.onContextItemSelected(item);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, ItemEditActivity.class);
        i.putExtra(ItemsModel.KEY_ROWID, id);
        startActivityForResult(i, ACTIVITY_EDIT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        fillList();
    }

    private void createItem() {
        Intent i = new Intent(this, ItemEditActivity.class);
        startActivityForResult(i, ACTIVITY_CREATE);
    }

    private void fillList() {
        // Get all of the notes from the database and create the item list
        Cursor itemCursor = mDbHelper.fetchAllItems();
        startManagingCursor(itemCursor);

        // Create an array to specify the fields we want to display in the list (only NAME)
        String[] from = new String[] { ItemsModel.KEY_NAME };

        // and an array of the fields we want to bind those fields to (in this case just item_row)
        int[] to = new int[] { R.id.item_row };

        // Now create an array adapter and set it to display using our row
        SimpleCursorAdapter notes =
            new SimpleCursorAdapter(this, R.layout.item_row, itemCursor, from, to);
        setListAdapter(notes);
    }

}

The code isn't near complete, but my goal is to combine the functionality of the android tutorial for the notepad with the touchlist.

My question is, what am I doing wrong. Also is there a better way to do drag and drop lists.

Thanks, Chris Swenor

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
Chris
  • 493
  • 3
  • 11
  • Ok I figured out why I'm getting the error. Because it's an interface I just need to implement it and not worry about overriding it. However for some reason my drop listener isn't getting triggered. – Chris Oct 11 '11 at 17:49

2 Answers2

1

You may be building using Java 1.5. In Java 1.5, you cannot use @Override with interface method definitions. They adopted that with Java 1.6.

However for some reason my drop listener isn't getting triggered.

Nothing leaps out at me as to where you are going wrong, other than I'm not a huge fan of System.out.print(). You might try using breakpoints or Log.w() or something instead to see if the issue is simply in the logging.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Yeah I am using my debugger now. For some reason it was not initializing so I was using System.out....which wasn't working anyway:) – Chris Oct 12 '11 at 15:12
  • Is there an easy way to check which version of Java I am using in eclipse? I have it installed on a new MacBook Air running OSX Lion. I had to install Java because it doesn't come with it anymore and I would be surprised if it wasn't 1.6. – Chris Oct 12 '11 at 15:15
  • The reason it wasn't getting triggered is because of how the remove action was messing with the methods. – Chris Oct 12 '11 at 15:17
  • @Chris: I'm afraid that I do not understand this comment. If there is something I need to address in code or docs, please let me know. With respect to Eclipse, I think the Java build settings are in the project properties. – CommonsWare Oct 12 '11 at 17:44
  • I found out my problem. Even though I had the latest Java installed Eclipse was still using the 1.5 Compiler Compliance Level. Thanks for your help. – Chris Oct 12 '11 at 21:12
0

It's complaining because you're trying to override a method that doesn't exist. I think the method may be called onDrop, not drop - change it and see if it compiles. Also, if you're using eclipse, click within your drop listener definition and type control+space, and a list of methods to override should come up, I'm guessing you'll see onDrop, not drop.

Sam Dozor
  • 40,335
  • 6
  • 42
  • 42