Пытаюсь дублировать код в демо для CWAC Touchlist и получаю ошибки для Android

#android #commonsware-cwac

#Android #commonsware-cwac

Вопрос:

Я разрабатываю уже более 10 лет на языках, отличных от Java. Я новичок в мире Android, но я пытаюсь погрузиться в него. Я пытаюсь создать перетаскиваемый список и нашел замечательные репозитории https://github.com/commonsguy/cwac-touchlist для выполнения перетаскивания элементов списка. Однако я получаю сообщение об ошибке, когда пытаюсь @Переопределить метод drop для интерфейса DropListener. В нем говорится, что: «Метод drop(int, int) типа new TouchListView.DropListener(){} должен переопределять метод суперкласса»

Я попытался реализовать способ, которым демо использует TouchList в моем приложении, и я также скопировал код точно в другом действии, и я получаю ту же ошибку.

Мой код:

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

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

}
  

Код не завершен, но моя цель — объединить функциональность Android-руководства для блокнота с touchlist.

Мой вопрос в том, что я делаю не так. Также есть лучший способ перетаскивания списков.

Спасибо, Крис Свенор

Комментарии:

1. Хорошо, я понял, почему я получаю ошибку. Поскольку это интерфейс, мне просто нужно его реализовать и не беспокоиться о его переопределении. Однако по какой-то причине мой прослушиватель drop не запускается.

Ответ №1:

Возможно, вы создаете с использованием Java 1.5. В Java 1.5 вы не можете использовать @Override определения методов интерфейса with. Они приняли это с Java 1.6.

Однако по какой-то причине мой прослушиватель drop не запускается.

Мне ничего не приходит в голову относительно того, где вы ошибаетесь, кроме того, что я не большой поклонник System.out.print() . Вы можете попробовать использовать Log.w() точки останова или что-то в этом роде, чтобы узнать, не связана ли проблема просто с протоколированием.

Комментарии:

1. Да, я сейчас использую свой отладчик. По какой-то причине он не инициализировался, поэтому я использовал System.out …. который все равно не работал 🙂

2. Есть ли простой способ проверить, какую версию Java я использую в eclipse? Я установил его на новый MacBook Air под управлением OSX Lion. Мне пришлось установить Java, потому что она больше не поставляется с ним, и я был бы удивлен, если бы это был не 1.6.

3. Причина, по которой он не срабатывал, заключается в том, что действие удаления мешало методам.

4. @Chris: Боюсь, я не понимаю этого комментария. Если есть что-то, что мне нужно решить в коде или документах, пожалуйста, дайте мне знать. Что касается Eclipse, я думаю, что настройки сборки Java находятся в свойствах проекта.

5. Я обнаружил свою проблему. Несмотря на то, что у меня была установлена последняя версия Java, Eclipse все еще использовал уровень соответствия компилятору 1.5. Спасибо за вашу помощь.

Ответ №2:

Он жалуется, потому что вы пытаетесь переопределить метод, которого не существует. Я думаю, что метод может вызываться onDrop, а не drop — измените его и посмотрите, компилируется ли он. Кроме того, если вы используете eclipse, щелкните в своем определении прослушивателя drop и введите control space, и должен появиться список методов для переопределения, я предполагаю, что вы увидите onDrop, а не drop .