Android创建对象并将其添加到listview

时间:2017-05-29 19:36:45

标签: android listview

我有一个主要活动,其XML文件包含ListView和FloatingActionButton。我还有另一个类,叫做B.当我打开活动时,它显示了B对象数组中的一些元素,我希望当我按下FAB按钮时,它会要求我输入一个字符串,然后用它string我将创建一个新的B对象。必须使用ListView和适配器列出所有B对象。此外,所有B对象都必须保存在存储器中。

我发现很难理解如何放置不同的东西以及如何操作要保存在存储上的B对象数组。当我创建一个新的B对象时,适配器如何知道数组中有一个新对象要显示在屏幕上?在我的活动的哪个地方,我必须放置创建B对象的部分?

FAB

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Allenamento a = createAllenamento();

        }
    });

我使用AlertDialog作为输入

public Allenamento createAllenamento(){
    Allenamento a = null;

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Title");

// Set up the input
    final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();

        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();
    a = new Allenamento(m_Text);
    return a;

}

谢谢

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你的目标就是通知适配器新项目已添加到数组列表并希望相应地更新列表视图,让我们说你的ArrayAdapter被调用&# 34;适配器"那么为了达到你的目的,我们使用

adapter.notifyDataSetChanged()

在对arraylist进行任何操作后调用该函数

关于将arraylist保存到存储,你应该使用ObjectSerializer序列化arraylist以便能够使用SharedPreferences保存它,例如:

  //retrieving the saved sharedPreferences if exists
    SharedPreferences sharedPreferences = getContext().getSharedPreferences("<replace with package name>.PREFERENCE_FILE_KEY", Context.MODE_PRIVATE);

  //editing the retrieved SharedPreferences and adding new data
    SharedPreferences.Editor editor = sharedPreferences.edit();
    try {

    editor.putString("key",ObjectSerializer.serialize(arraylist));

    } catch (IOException e) {
       e.printStackTrace();
    }

   //finally we commit the editor to save changes
    editor.commit();

   //Now to retrieve the arraylist when the app is opened again
   SharedPreferences sharedPreferences = getContext().getSharedPreferences("<replace with package name>.PREFERENCE_FILE_KEY", Context.MODE_PRIVATE);

   ArrayList<B> arraylist = new ArrayList<B>();

   try {

   arraylist = (ArrayList<B>) ObjectSerializer.deserialize(sharedPreferences.getString("key",ObjectSerializer.serialize(new ArrayList<B>())));

   } catch (IOException e) {
     e.printStackTrace();
   } catch (ClassNotFoundException e) {
     e.printStackTrace();
   }

答案 1 :(得分:0)

在你的代码中,当创建Allenamento时,m_Text仍为空,并返回空的Allenamento。在positiveButton的点击监听器中创建Allenamento,并将新的Allenamento添加到用于显示listView的列表中,然后使用

刷新listView
adapter.notifyDataSetChanged()

您可以找到更多详情here

试试这个:

FAB:

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            createAllenamento();
        }
    });

和AlertDialog:

Allenamento a = null;
public void createAllenamento(){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Title");
    // Set up the input
    final EditText input = new EditText(this);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();
            a = new Allenamento(m_Text);
            listOfAllenamento.add(a);
            adapter.notifyDataSetChanged();
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();
}