Android 在列表视图中编辑条目

Android 在列表视图中编辑条目,android,android-listview,Android,Android Listview,我正在开发一个简单的日志应用程序,它允许用户输入时间和注释,然后在专用活动(mainacactivty)的ListView中显示输入的数据。时间和数据通过两个EditText输入到一个单独的活动(AddTimeActivity)中,并通过适配器(TimeTrackerAdapter)点击保存按钮时传递到MainActivity)。或者,当用户改变主意时,可以按下取消按钮。可以通过操作栏默认菜单中的添加按钮访问AddTimeActivity。现在我为列表中的每一行添加了一个delete按钮和一个e

我正在开发一个简单的日志应用程序,它允许用户输入时间和注释,然后在专用活动(
mainacactivty
)的
ListView
中显示输入的数据。时间和数据通过两个
EditText
输入到一个单独的活动(
AddTimeActivity
)中,并通过适配器(
TimeTrackerAdapter
)点击保存按钮时传递到
MainActivity
)。或者,当用户改变主意时,可以按下取消按钮。可以通过操作栏默认菜单中的添加按钮访问
AddTimeActivity
。现在我为列表中的每一行添加了一个delete按钮和一个edit按钮。现在的问题是:我如何添加编辑功能而不进行专门用于编辑的新活动。换句话说,我如何让
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);
    }
}
AddTimeActivity
onSave
onCancel
是按钮的方法:

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;
    }
}
公共类TimeTrackerAdapter扩展BaseAdapter{
public ArrayList times=new ArrayList();
@凌驾
public int getCount(){
返回次数。size();
}
公共时间跟踪器适配器(){
添加(新的时间记录(“12:30”,“这是最好的”);
添加(新的时间记录(“2:30”,“我需要这个”));
}
@凌驾
公共对象getItem(int位置){
返回次数。获取(位置);
}
public void addTimeRecord(TimeRecord TimeRecord){
添加(时间记录);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组父视图){
如果(视图==null){
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
视图=充气机。充气(R.layout.menu\u布局,父级,false);
}
TextView timeView=(TextView)view.findViewById(R.id.time\u TextView);
TextView noteView=(TextView)view.findViewById(R.id.note\u TextView);
Button deleteButton=(Button)view.findViewById(R.id.delete_条目);
deleteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
次。移除(位置);
notifyDataSetChanged();
}
});
TimeRecord time=次。获取(位置);
timeView.setText(time.getTime());
setText(time.getNote());
返回视图;
}
}
问题是

如何添加编辑功能而不进行专门用于编辑的新活动

或者,更一般地说

“我如何将信息传递给我正在呼叫的活动?”

您可以通过向用于启动活动的意图中添加额外内容来实现这一点。例如,在调用“startActivityForResult()”之前的“MainActivity”中:

然后,在另一个活动的“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(position)”中的旧数据作为额外数据传递给intent

要从适配器类访问“MainActivity”中的方法,可以在“getView()”中使用以下代码


这样,您的其他活动就可以检查该捆绑包的存在。如果没有,则有一个“add”案例。否则,将出现“编辑”的情况

使用
ViewHolder
管理列表视图适配器,请参阅本教程:感谢您的回答,但此处的调用活动是什么?
TimeTrackerAdapter
MainActivity
?因为编辑按钮在视图中由adapter@SamIbraheem-这是使用“startActivityForResult()”的活动。感谢您的反馈-我将编辑我的帖子以使其更清晰谢谢您遇到这么多麻烦,现在编辑按钮位于膨胀视图中(在TimeTrackerAdapter类中),如何通过单击编辑按钮启动活动?非常感谢您的帮助,但现在我面临一个异常:ActivityNotFound exception。它说即使我在清单中声明了AddTimeActivity,也找不到它?@SamIbraheem-现在我很惊讶-我认为添加已经起作用了,这是由AddTimeActivity完成的。你能把堆栈跟踪贴出来吗?仔细想想:这基本上是一个新问题。我很想帮助你,但是如果你开始通过添加另一个主题来改变这个问题,那么在这里寻找自己问题解决方案的其他人会感到困惑。你能试着发布另一个问题吗(包括你的代码和堆栈跟踪)?我看问题队列。
Intent i = getIntent();
if (i != null && i.hasExtra(getString("MyExtraInformationKey"))
{
    boolean myInfo = i.getBooleanExtra("MyExtraInformationKey");
    // proceed as appropriate...
}
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));
    }