2015-08-24 86 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类中),如何通过单击来启动该活动编辑按钮? –