我有多个变量,我们称之为varA
,varB
,varC
和varD
。按下按钮时,这些4 variables
将一起存储在ArrayList中。这将创建一个可由变量varA查看的条目。可以通过ListView
在ArrayAdapter
中查看所有条目。
的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个变量将保持在一个“配置文件”中,这样它们就不会与其他一些可能在以后添加的数据混在一起
答案 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格式)。
希望这会有用。