2016-12-27 10 views
0

複数の変数がありますが、varA,varB,varCおよびvarDと呼びます。ボタンを押すと、4 variablesが一緒にArrayListに格納されます。これにより、変数varAで表示できる単一のエントリが作成されます。すべてのエントリはで表示され、ArrayAdapterによって行われます。Android ArrayList:プロファイルに複数の値を格納する

の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

まずは((ArrayAdapter)profileList.getAdapter())を使用しようとしています。notifyDataSetChanged();リストビューを更新するには、アプリケーションを再ビルドした後にのみリストビューが更新されます。リストビューを更新するにはどうすればよいですか? – Pie

答えて

0

は、それがすでに存在する場合はチェックを格納し得ることから繰り返される値を避けるために:リストビューの更新用の問題については

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

、代わりにnotifyDataSetChangedのnotifyItemInserted(位置)を使用する()

 yourAdapter.notifyItemInserted(position); 
0

私は理解しているように、 1つのエントリに4つのデータを含み、最初のものだけを表示するリストを表示するとします。

この場合、カスタムModelを作成すると簡単になります。これは、1つのオブジェクトであなた件のデータを格納します:

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以外のデータでアダプターを塗りたいので、カスタムモデルを使用することをお勧めします。 1つを作成するのは難しいことではないし、場合によってはアップデートで異なる動作が必要な場合があるため、カスタムのnotifyDataSetChangedメソッドを使用することをお勧めします。

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

は、このアダプタを更新するには次のようにアダプターを設定することができ、その後

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(); 
    } 
} 


だから、ここにあなたが使用したものと同じレイアウトを持つシンプルなアダプタです

// 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形式に変換する)。

これは役に立ちます。

関連する問題