Android ArrayList:将多个值存储到配置文件中

时间:2016-12-27 00:51:35

标签: java android xml arraylist

我有多个变量,我们称之为varAvarBvarCvarD。按下按钮时,这些4 variables将一起存储在ArrayList中。这将创建一个可由变量varA查看的条目。可以通过ListViewArrayAdapter中查看所有条目。

的onCreate

ArrayAdapter<String> profileAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
    profileList.setAdapter(profileAdapter);

按下按钮时

// Add data to a new profile in @+id/profileList ListView
ArrayList<String> arrayList= new ArrayList<>();
arrayList.add(varA);
System.out.println("varA's");
System.out.println(arrayList);
((ArrayAdapter)profileList.getAdapter()).notifyDataSetChanged();

布局

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/overviewLayout">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/profileList"/>
    </RelativeLayout>

我遇到了ListView的问题,显示了已添加的项目。此外,我试图使用TinyDB来存储这些项目,以便稍后可以引用它们,因为按下按钮时使用的ArrayList只是暂时的。我也无法弄清楚如何设置它,这样每次按下按钮时,这4个变量将保持在一个“配置文件”中,这样​​它们就不会与其他一些可能在以后添加的数据混在一起

2 个答案:

答案 0 :(得分:0)

为避免重复存储值,请检查它是否已存在:

    if(!arrayList.contains(varA)){
      arrayList.add(varA); 
    }

对于listview更新问题,请使用notifyItemInserted(position)而不是notifyDataSetChanged()

     yourAdapter.notifyItemInserted(position);

答案 1 :(得分:0)

据我了解,您希望在一个条目中显示一个包含4个数据的列表,并仅显示其中的第一个。

如果是,您可以创建自定义Model,这会更容易。这会将您的数据存储在一个对象中:

ProfileModel
    |
    |-- varA
    |-- varB
    |-- varC
    '-- varD

您的自定义模型可能如下所示:

public class ProfileModel {

    private String varA;
    private float varB;
    private int varC;
    private String varD;

    // getters
    ...
    // setters
    ...

    public ProfileModel() { } 
}

在开始时初始化配置文件列表:

ArrayList<ProfileModel> list = new ArrayList<>();

要填充主列表,请执行以下操作:

// create a list of object to the datas
ProfileModel profile = new ProfileModel();
profile.setVarA(varA);
profile.setVarB(varB);
profile.setVarC(varC);
profile.setVarD(varD);
// then fill the first list
list.add(profile);

由于您希望使用除简单String之外的其他数据填充适配器,而是使用自定义模型,我更愿意使用自定义适配器。创建一个并不难,因为有时候,您可能希望在更新时使用不同的行为,我也更喜欢使用自定义notifyDataSetChanged方法。 所以,这是一个简单的适配器,其布局与您使用的相同:

public class ProfileAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<ProfileModel> listProfiles;

    public ProfileAdapter(Context context, ArrayList<ProfileModel> listProfiles) {
        super();
        this.context = context;
        this.listProfiles = listProfiles;
    }

    private class ViewHolder {
        private TextView textVarA;
    }

    @Override
    public int getCount() {
        return listProfiles != null ? listProfiles.size() : 0;
    }

    @Override
    public Object getItem(int i) {
        return listProfiles.get(i); // will return the profile model from position
    }

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

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        ViewHolder holder;

        if (view == null) {
            holder = new ViewHolder();
            view = LayoutInflater.from(context)
                    .inflate(android.R.layout.simple_list_item_1, null);
            holder.textVarA = (TextView) view.findViewById(android.R.id.text1);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        ProfileModel profile = listProfiles.get(i);
        holder.textVarA.setText(profile.getVarA()); // get varA value

        return view;
    }

    public void addEntry(ProfileModel newEntry) {
        listProfiles.add(newEntry);
        this.notifyDataSetChanged();
    }
}

然后,您可以按如下方式设置适配器:

ProfileAdapter profileAdapter = new ProfileAdapter(this, list);
profileList.setAdapter(profileAdapter);

更新此适配器:

// create a list of object to the datas
ProfileModel profile = new ProfileModel();
profile.setVarA(varA);
profile.setVarB(varB);
profile.setVarC(varC);
profile.setVarD(varD);
profileAdapter.addEntry(profile); // this will call notifyDataSetChanged

最后,我不是很了解TinyDB,但我看到它正在使用一些JSON文件来存储数据。因此,您可以创建一个方法将数据转换为JSONArray,其名称为varA且值为varB, varC, varD。有很多示例如何将数据转换为JSON(使用Gson将模型转换为JSON格式)。

希望这会有用。