2015-03-24 3 views
0

Я делаю приложение, чтобы помочь мне в школе. Но у меня проблема: когда я хочу позицию (int position) listView, она ВСЕГДА возвращает первую позицию, даже если я выбираю третью позицию, например.ListView всегда возвращает первую позицию

public class TestsActivity extends ListActivity implements AdapterView.OnItemClickListener, DialogInterface.OnClickListener { 
    private List<Map<String, Object>> tests; 
    private AlertDialog dialogDelete; 
    private int selectedTest; 
    private Application dao; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tests_activity); 

     dao = new Application(this); 

     android.app.ActionBar actionBar = getActionBar(); 
     actionBar.setTitle("My tests"); 

     actionBar.setHomeButtonEnabled(true); 
     actionBar.setDisplayHomeAsUpEnabled(true); 

     String[] from = {"subject", "content"}; 
     int[] to = {R.id.subject, R.id.content}; 

     SimpleAdapter adapter = new SimpleAdapter(this, listTests(), R.layout.test_list_activity, from, to); 
     setListAdapter(adapter); 
     getListView().setOnItemClickListener(this); 

     registerForContextMenu(getListView()); 

     this.dialogDelete = createDialogDelete(); 
    } 

    private List<Map<String, Object>> listTests() { 

     tests = new ArrayList<Map<String, Object>>(); 

     List<Test> TestList = dao.listTests(); 

     for (Test test : TestList) { 

      Map<String, Object> item = new HashMap<String, Object>(); 

      Long id = test.getId(); 
      String subject = test.getSubject(); 

      item.put("id", test.getId()); 

      item.put("subject", subject); 

      test.add(item); 
     } 

     return tests; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Map<String, Object> map = tests.get(position); 

     String subject = (String) map.get("subject"); 
     String msg = "Test of" + subject; 

     Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); 

     selectedTest = position; 

    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.tests_context_menu, menu); 
    } 

    public boolean onContextItemSelected(MenuItem item) { 

     Intent intent; 
     String id = String.valueOf(tests.get(selectedTest).get("id")); 

     switch (item.getItemId()) { 

      case R.id.remove: 
       dialogDelete.show(); 
       break; 

      case R.id.edit: 
       intent = new Intent(this, NewTestActivity.class); 
       intent.putExtra(Constantes.TEST_ID, id); 
       startActivity(intent); 
       return true; 
     } 

     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int item) { 
     Intent intent; 
     String id = String.valueOf(tests.get(selectedTest).get("id")); 

     switch (item) { 
      case DialogInterface.BUTTON_POSITIVE: 
       tests.remove(selectedTest); 
       dao.removeTest(id); 
       getListView().invalidateViews(); 
       break; 

      case DialogInterface.BUTTON_NEGATIVE: 
       dialogDelete.dismiss(); 
       break; 
     } 
    } 

    private AlertDialog createDialogDelete() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     builder.setMessage(R.string.confirm_delete_test); 

     builder.setPositiveButton(getString(R.string.yes), (android.content.DialogInterface.OnClickListener) this); 
     builder.setNegativeButton(getString(R.string.no), (android.content.DialogInterface.OnClickListener) this); 

     return builder.create(); 
    } 

    @Override 
    protected void onDestroy() { 
     dao.close(); 
     super.onDestroy(); 
    } 
} 

Как его решить?

+0

Пожалуйста, более конкретно. Вы имеете в виду позицию в public void onItemClick? –

+0

Например, я хочу удалить тест. Итак, я получаю значение позиции и устанавливаю переменную selectedTest в onItemClick, но я всегда получаю первую позицию – leonero

+0

Где этот код? PLS просто отправьте его ... –

ответ

1
for (Test test : TestList) { 

     Map<String, Object> item = new HashMap<String, Object>(); 

     Long id = test.getId(); 
     String subject = prova.getSubject(); 

     item.put("id", prova.getId()); 

     item.put("subject", subject); 

     tests.add(item); 
    } 

Попробуйте изменить из

test.add(item); 

в

tests.add(item); 
0

Вы когда-нибудь назвать listTests() в вас активность? Для чего это этот частный метод?

Вы должны вызвать listTests() где-нибудь.

0

может быть, и должны использовать пользовательские BaseAdapter это поможет U явно создавать все CEIL из ListView

private class Simple extends BaseAdapter { 
    @Override 
    public int getCount() { 
     return 0; 
    } 

    @Override 
    public Object getItem(int i) { 
     return i; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) 
    { 
     return view; 
    } 
} 
0

На основе ваших ответов, вот мои предложения.

1) В listTests(), изменение от:

test.add(item); 

К:

tests.add(item); 

Причиной является объектом испытания является ArrayList, содержащий тест-объекта.

2) Поскольку код зависит от списка дао от List<Test> TestList = dao.listTests();, я хочу избежать непредвиденного удаления элементов списка. Так в protected void onDestroy(), удалить:

dao.close(); 
+0

Aaah, я обнаружил, что позиция хорошо работает при нажатии на элемент. Но глобальная переменная selectedTest не работает с другими функциями – leonero