2016-12-27 6 views
0

여러 변수가 있는데, varA, varB, varCvarD이라고합니다. 버튼을 누르면 이것들이 함께 ArrayList에 저장됩니다. 4 variables 이렇게하면 변수 varA로 볼 수있는 단일 항목이 만들어집니다. 모든 항목은 ListView으로 볼 수 있으며 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

내가 알고있는 것처럼, 하나의 항목에 4 개의 데이터가 들어있는 목록을 표시하고 첫 번째 항목 만 표시하려고합니다.

만약 그렇다면 사용자 정의 Model을 만들면 더 쉬울 것입니다. 이것은 하나의 객체에 datas를 저장합니다 :

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

채우려면 :

public class ProfileModel { 

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

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

    public ProfileModel() { } 
} 

시작 프로파일의 목록을 초기화 :

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

귀하의 사용자 정의 모델이 같은처럼 보일 수 있습니다 주요 목록은 다음과 같습니다 :

// 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 메서드를 사용하는 것을 선호합니다.

:

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 파일을 사용하고있는 것을 보았습니다. 따라서 데이터를 varA이고 값이 varB, varC, varD 인 JSONArray로 변환하는 메소드를 작성할 수 있습니다. 데이터를 JSON으로 변환하는 방법에 대한 많은 예제가 있습니다 (Gson을 사용하여 모델을 JSON 형식으로 변환).

희망이 유용 할 것입니다.