【问题标题】:how to dynamically keep on adding data to a custom ArrayList from a single EditText如何从单个 EditText 动态地继续将数据添加到自定义 ArrayList
【发布时间】:2014-04-18 06:15:05
【问题描述】:

我在用户输入内容的片段中有一个 EditText,并且 OnClick 将数据添加到自定义 ArrayList。然后是另一个按钮,它需要一个 ListView 片段,其中应该列出所有数据,但只能看到用户输入的最新项目。

在按钮的 OnClick 中添加数据的代码,我认为这是我做错的地方

EditText timeText = (EditText) getView().findViewById(
                        R.id.dateTimeEText);

                EditText entryText = (EditText) getView().findViewById(
                        R.id.diaryEntryEText);
                String timeEntry = timeText.getText().toString();

                String entryEntered = entryText.getText().toString();

                ArrayList<DiaryLogs> entryLogs = new ArrayList<DiaryLogs>();

                DiaryLogs dl = new DiaryLogs(1, timeEntry, entryEntered);
                entryLogs.add(dl);

以下其他代码

自定义对象类 DiaryLogs

public class DiaryLogs {

    //public static ArrayList<DiaryLogs> entryLogs;

    String timeEntry, entryEntered;
    int day;

    // single constructor that takes an integer and two string
    public DiaryLogs(int day, String timeEntry, String entryEntered) {
        super();
        this.day = day;
        this.timeEntry = timeEntry;
        this.entryEntered = entryEntered;

    }

    public String getTimeEntry() {
        return timeEntry;
    }

    public void setTimeEntry(String timeEntry) {
        this.timeEntry = timeEntry;
    }

    public String getEntryEntered() {
        return entryEntered;
    }

    public void setEntryEntered(String entryEntered) {
        this.entryEntered = entryEntered;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.timeEntry + "\n" + this.entryEntered;


    }


}

更新 Class Monday_fragment

public class Monday_fragment extends Fragment {

    public ArrayList<String> myStringList;
    Bundle bundle;
    ArrayList<DiaryLogs> entryLogs;
    EditText timeText;
    EditText entryText;
    DiaryLogs dl;
    String timeEntry;
    String entryEntered;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return inflater.inflate(R.layout.monday_fragment, container, false);

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        currentDateTime();
        super.onViewCreated(view, savedInstanceState);

    }

    public void currentDateTime() {
        EditText timeText = (EditText) getView().findViewById(
                R.id.dateTimeEText);
        SimpleDateFormat df = new SimpleDateFormat("d/M/yyyy:H:m");
        String dateTime = df.format(Calendar.getInstance().getTime());
        timeText.setText(dateTime);
    }

    public ArrayList<String> toStringList(Collection<DiaryLogs> entryLogs) {
        ArrayList<String> stringList = new ArrayList<String>();

        for (DiaryLogs myobj : entryLogs) {
            stringList.add(myobj.toString());
        }

        return stringList;
    }

    @Override
    public void onStart() {
        entryLogs = new ArrayList<DiaryLogs>();
        timeText = (EditText) getView().findViewById(R.id.dateTimeEText);

        entryText = (EditText) getView().findViewById(R.id.diaryEntryEText);

        Button saveBtn = (Button) getView()
                .findViewById(R.id.saveDiaryEntryBtn);
        saveBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                timeEntry = timeText.getText().toString();

                entryEntered = entryText.getText().toString();

                dl = new DiaryLogs(1, timeEntry, entryEntered);

                entryLogs.add(dl);
                //convert entryLogs to string array list
                myStringList = toStringList(entryLogs);

                Toast.makeText(getActivity(), "Entry added \n" + dl,
                        Toast.LENGTH_SHORT).show();
                        entryText.setText("");






            }

        }

        );
        System.out.println(entryLogs);

        Button showBtn = (Button) getView().findViewById(
                R.id.showDiaryEntriesBtn);
        showBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                if (myStringList != null) {
                    bundle = new Bundle();
                    FragmentManager fragmentManager = getFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager
                            .beginTransaction();
                    Monday_list_fragment mlf = new Monday_list_fragment();

                    bundle.putStringArrayList("list", myStringList);
                    mlf.setArguments(bundle);

                    fragmentTransaction.replace(android.R.id.content, mlf);
                    fragmentTransaction.commit();
                }
                if (myStringList == null) {
                    Toast.makeText(getActivity(),
                            "No entry have been added yet", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });

        super.onStart();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

}

类 Monday_list_fragment

        public class Monday_list_fragment extends ListFragment {
    ArrayList<String> logs;
    Bundle bundle;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater
                .inflate(R.layout.monday_list_fragment, container, false);

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
        bundle = this.getArguments();
        if (bundle != null) {
            logs = bundle.getStringArrayList("list");

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                    getActivity(), android.R.layout.simple_list_item_1, logs);
            setListAdapter(adapter);

        }

    }

}

【问题讨论】:

    标签: java android arraylist


    【解决方案1】:
    ArrayList<DiaryLogs> entryLogs = new ArrayList<DiaryLogs>();  
    

    使该对象成为全局变量。在带有edittext 的活动/片段中,将其分解为:

    ArrayList<DiaryLogs> entryLogs;
    

    还有

    entryLogs = new ArrayList&lt;DiaryLogs&gt;(); 部分转移到-on 活动或片段创建。

    现在发生的情况是每次输入数据时都会创建 entryLogs arrayList。所以你只能看到其中的最后一个条目。

    当您将add() 对象添加到全局数组列表时,它会逐步添加每个对象。

    对于您的实现,我认为应该初始化 myStringList,并以与 entryLogs 列表相同的方式填充。所以保持 ADDING 对象到myStringList 而不是分配函数。

    在这种情况下,更改必须是这样的:

    myStringList = toStringList(entryLogs);  
    

    必须是:

    myStringList.addAll(toStringList(entryLogs));
    

    【讨论】:

    • 我已更改代码检查 UPDATE,但仍将其替换为最新值。
    • 代码不是只添加“d1”对象吗? [它通过 for-each 传递给 toStringList,很高兴看到这种用法,但你传递的更多吗?]
    • 是的,但我想要的是在新的 onClick 上创建新的 dl 并继续添加到现有的 ArrayList 然后使用 toStringList 方法将整个 ArrayList 转换为字符串数组,因为我必须通过参数捆绑到 Monday_list_fragment 的 ListView
    • 在我将其更改为 myStringList.addAll(toStringList(entryLogs)); 后,它在 OnClick 上崩溃了
    • Monday_fragment 类中的公共方法public ArrayList&lt;String&gt; toStringList(Collection&lt;DiaryLogs&gt; entryLogs) { ArrayList&lt;String&gt; stringList = new ArrayList&lt;String&gt;(); for (DiaryLogs myobj : entryLogs) { stringList.add(myobj.toString()); } return stringList; }
    猜你喜欢
    • 2021-10-27
    • 2014-11-04
    • 2015-02-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2022-01-15
    相关资源
    最近更新 更多