2015-08-24 143 views
1

我正在製作一個簡單的日誌應用程序,讓用戶輸入時間和備註,然後在ListView的專用活動(MainActivty)中顯示輸入的數據。時間和數據輸入一個單獨的活動(AddTimeActivity)與兩個EditText和輸入MainActivity通過適配器(TimeTrackerAdapter)點擊保存按鈕時傳遞。或者,當用戶改變主意時可以按下取消按鈕。可以通過操作欄默認菜單中的添加按鈕訪問AddTimeActivity。現在我已經添加了一個刪除按鈕(它工作正常),並且在列表中的每一行都添加了一個編輯按鈕。現在的問題是:如何添加編輯功能而不用專門編輯新的活動。換句話說,我怎樣才能讓AddTimeActivity在編輯和添加的同時工作,我如何讓我的應用程序知道用戶點擊了添加按鈕,然後用空EditText開始AddTimeActivity,或者用戶點擊了編輯按鈕,並將要編輯的數據傳遞到AddTimeActivity,並將它們顯示在EditText中,並將編輯後的數據保存在同一條目中?對不起,沒有顯示任何嘗試,但我實際上對這個問題無能爲力。在列表視圖中編輯條目

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    public TimeTrackerAdapter timeTrackerAdapter; 
    public int TIME_ENTRY_REQUEST_CODE = 1; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView listView = (ListView) findViewById(R.id.time_list); 
     timeTrackerAdapter = new TimeTrackerAdapter(); 
     listView.setAdapter(timeTrackerAdapter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     super.onCreateOptionsMenu(menu); 
     MenuInflater menuInflater = getMenuInflater(); 
     menuInflater.inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == TIME_ENTRY_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       Bundle bundle = data.getExtras(); 
       String time = bundle.getString("time"); 
       String note = bundle.getString("note"); 
       TimeRecord timeRecord = new TimeRecord(time, note); 
       timeTrackerAdapter.addTimeRecord(timeRecord); 
       timeTrackerAdapter.notifyDataSetChanged(); 
      } 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     // noinspection SimplifiableIfStatement 
     if (id == R.id.add_time_item) { 
      Intent intent = new Intent(getApplicationContext(), AddTimeActivity.class); 
      startActivityForResult(intent, TIME_ENTRY_REQUEST_CODE); 
      return true; 
     } 

     else if (id == R.id.about) { 
      Intent aboutIntent = new Intent(getApplicationContext(), AboutScreen.class); 
      startActivity(aboutIntent); 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

AddTimeActivityonSaveonCancel是按鈕的方法:

public class AddTimeActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.add_time); 
    } 

    public void onCancel(View view) { 
     finish(); 
    } 

    public void onSave(View view) { 
     Intent intent = new Intent(AddTimeActivity.this, MainActivity.class); 
     EditText timeEditText = (EditText) findViewById(R.id.Time_Edit_Text); 
     String time = timeEditText.getText().toString(); 
     EditText noteEditText = (EditText) findViewById(R.id.Note_Edit_Text); 
     String note = noteEditText.getText().toString(); 
     intent.putExtra("time", time); 
     intent.putExtra("note", note); 
     this.setResult(RESULT_OK, intent); 
     finish(); 
    } 
} 

TimeTrackerAdapter.java:

public class TimeTrackerAdapter extends BaseAdapter { 
    public ArrayList<TimeRecord> times = new ArrayList<TimeRecord>(); 

    @Override 
    public int getCount() { 
     return times.size(); 
    } 

    public TimeTrackerAdapter() { 
     times.add(new TimeRecord("12:30", "this is the best")); 
     times.add(new TimeRecord("2:30", "I need this")); 
    } 

    @Override 
    public Object getItem(int position) { 
     return times.get(position); 
    } 

    public void addTimeRecord(TimeRecord timeRecord) { 
     times.add(timeRecord); 
    } 

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

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     if (view == null) { 
      LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
      view = inflater.inflate(R.layout.menu_layout, parent, false); 
     } 
     TextView timeView = (TextView) view.findViewById(R.id.time_textView); 
     TextView noteView = (TextView) view.findViewById(R.id.note_TextView); 
     Button deleteButton = (Button) view.findViewById(R.id.delete_entry); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       times.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     TimeRecord time = times.get(position); 
     timeView.setText(time.getTime()); 
     noteView.setText(time.getNote()); 
     return view; 
    } 
} 
+0

使用'ViewHolder'來管理你的列表視圖適配器,請參閱本教程:https://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html – AsfK

回答

2

問題是

如何添加編輯功能而無需進行專門編輯的新活動。

,或者更一般地說,

「我怎麼交出信息,我打電話的活動嗎?」

您可以通過向用於啓動活動的意圖添加附加功能來實現此目的。例如,在你的 'MainActivity' 之前調用 'startActivityForResult()':

Intent intent = new Intent(this, MyOtherActivity.class); 
// in your case, 'extraInformation' could be a boolean (add = yes|no) 
intent.putExtra("MyExtraInformationKey", extraInformation); 
startActivityForResult(intent,TIME_ENTRY_REQUEST_CODE); 

然後在 '的onCreate()' 的其他活動的方法,你的問題了額外的意圖:

Intent i = getIntent(); 
if (i != null && i.hasExtra(getString("MyExtraInformationKey")) 
{ 
    boolean myInfo = i.getBooleanExtra("MyExtraInformationKey"); 
    // proceed as appropriate... 
} 

對於您在ListView行內按鈕的情況,您可以使OnClickListener方法調用另一個方法(如'MainActivity'中的'doCallMayOtherActivity()'),交付所有相關信息(如'times'ArrayList中的位置)。 然後,此方法將啓動您的添加/編輯活動,將舊數據從包中的'times.get(位置)'作爲額外內容傳遞給意圖。

要從適配器類訪問「MainActivity」的方法,你可以在使用下面的代碼「getView()」

Button editButton=(Button) view.findViewById(R.id.edit_entry); 
editButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     ((MainActivity)parent.getContext()).doCallMyOtherActivity(times.get(position)); 
    } 

這樣,你的其他活動可以檢查該束存在。如果沒有,則會出現「添加」的情況。否則,你有一個'編輯'的情況。

+0

謝謝你的回答,但哪一個是在這裏考慮召喚活動? TimeTrackerAdapter或MainActivity?因爲編輯按鈕在適配器 –

+0

@SamIbraheem中膨脹的視圖中 - 這就是您使用'startActivityForResult()'的活動。感謝您的反饋 - 我將編輯我的文章以清除此問題 – 0X0nosugar

+0

感謝您遇到這麼多麻煩,現在編輯按鈕處於膨脹視圖中(在TimeTrackerAdapter類中),如何通過單擊來啓動該活動編輯按鈕? –