2013-03-30 3 views
0

В моем приложении для Android у меня есть список стран, в которые я могу добавлять новые записи в любое время, когда приложение работает. Этот список хранится в базе данных. Я попытался несколько разных способов попытаться реализовать OnListItemClick, но я не могу заставить его работать. Вот мой класс, содержащий мой список:OnListItemClick в действии

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class MainActivity extends Activity 
{ 
    private DBManager db; 
    Cursor cursor; 
    Button goEdit; 
    ListView listContent; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.initial_activity); 

     listContent = (ListView)findViewById(R.id.list); 
     goEdit = (Button)findViewById(R.id.goedit); 

     //Open database 
     db = new DBManager(this); 
     db.openToRead(); 

     cursor = db.queueAll(); 

     String[] from = new String[]{DBManager.KEY_ID, DBManager.KEY_YEAR, DBManager.KEY_CONTENT, DBManager.KEY_DESC}; 
     int[] to = new int[]{R.id.editcountry, R.id.yeartext, R.id.countrytext}; 

     SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to); 

     listContent.setAdapter(cursorAdapter); 

     //go to add/delete screen 
     goEdit = (Button)findViewById(R.id.goedit); 
     goEdit.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       Log.i("Test", "Now moving to the edit activity"); 
       Intent intent = new Intent(MainActivity.this, EditList.class); 
       startActivity(intent); 
      } 
     }); 
    } 

    //life cycles 
    protected void onPause() 
    { 
     super.onPause(); 
     db.close(); 
    } 

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

Вот мой класс, где я могу выбрать, чтобы ввести новые страны в списке:

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 

public class EditList extends Activity 
{ 
    private DBManager db; 
    Cursor cursor; 
    EditText editCountry, editYear, editDesc; 
    Button add, delete, back; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editCountry = (EditText)findViewById(R.id.editcountry); 
     editYear = (EditText)findViewById(R.id.edityear); 
     editDesc = (EditText)findViewById(R.id.editdesc); 
     add = (Button)findViewById(R.id.add); 
     delete = (Button)findViewById(R.id.delete); 
     back = (Button)findViewById(R.id.backmain); 

     //Open database and fill it with content, then close it 
     db = new DBManager(this); 
     db.openToWrite(); 

     cursor = db.queueAll(); 

     add.setOnClickListener(buttonAddOnClickListener); 
     delete.setOnClickListener(buttonDeleteAllOnClickListener); 

     //handle switching back to main screen 
     Log.i("Test", "back to main"); 
     back = (Button)findViewById(R.id.backmain); 
     back.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       db.close(); 

       //can't use "finish()" because then the list won't refresh with the new data 
       Log.i("Test", "Going back to the main screen"); 
       Intent intent = new Intent(EditList.this, MainActivity.class); 
       startActivity(intent); 
      } 
     }); 
    } 

    //insert new country button 
    Button.OnClickListener buttonAddOnClickListener = new Button.OnClickListener() 
    { 
     @Override 
     public void onClick(View arg0) 
     { 
      Toast.makeText(getApplicationContext(), "Added!", Toast.LENGTH_LONG).show(); 

      int year = Integer.parseInt(editYear.getText().toString()); 
      String country = editCountry.getText().toString(); 
      String desc = editDesc.getText().toString(); 

      db.insert(year, country, desc); 

      updateList(); 

      //clear text fields after use 
      editYear.setText(null); 
      editCountry.setText(null); 
      editDesc.setText(null); 
     } 
    }; 

    //delete all button 
    Button.OnClickListener buttonDeleteAllOnClickListener = new Button.OnClickListener() 
    { 
     @Override 
     public void onClick(View arg0) 
     { 
      Toast.makeText(getApplicationContext(), "Your list has been deleted!", Toast.LENGTH_LONG).show(); 
      db.deleteAll(); 
      updateList(); 
     } 
    }; 

    private void updateList() 
    { 
     cursor.requery(); 
    } 

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

Я ранее реализованного в OnListItemClick в классе, где данные была статически проведена в массиве. Этот класс также расширил ListActivity, которого нет у этого.

ответ

2

Разница между ListActivity и стандартным Activity является то, что ListActivity обработал отображение OnItemClickListener интерфейс для Вас, и только при условии, дополнительный метод обратного вызова. Без ListActivity, вам нужно добавить, что сантехника сама; то есть

public class MainActivity extends Activity implements AdapterView.OnItemClickListener 
{ 
    ... 
    ListView listContent; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     ... 

     listContent.setOnItemClickListener(this); 

     ... 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     //Callback logic here for clicked items 
    } 

    ... 
} 
+0

Это большое спасибо. Я не понял разницы между Activity и ListActivity, пока вы не объяснили мне это. Еще раз спасибо! – colmulhall

0

В вашем MainActivity добавить

@Override 
public void onListItemClick(ListView l, View v, int position, long id) 
{ 
     super.onListItemClick(l, v, position, id); 

     // a list item is click do whatever you want 
}