2011-12-23 3 views
1

내 프로젝트는 다음과 같이 단순화됩니다. 먼저 데이터 저장을 위해 Data.java 응용 프로그램 메서드를 사용합니다.notifyDataSetChanged를 사용하는 방법

private ArrayList<String> data = new ArrayList<String>(); 
public int getsize() { 
return this.data.size(); 
} 
public String getdata(int i) { 
return this.data.get(i); 
} 
public void adddata(String s) { 
return this.data.add(s); 
} 

내 AActivity 클래스에서 onCreate 아래와 같이 : 그것은 데이터를 포함

Data d = (Data)this.getApplication(); 
String test = new String[d.getsize()]; 
for(i = 0; i < d.getsize(); i++) { 
test[i] = d.getdata(i); 
} 
//to show in list 
DataAdapter = new DataAdapter (this, test); 
setListAdapter(DataAdapter); 

그리고 버튼을 클릭, startActivity를 BActivity 클래스 인 경우. BActivity 클래스에서 , 아래의 코드 :

Data d = (Data)this.getApplication(); 
d.adddata("newdata"); 
finish(); 

그리고 AActivity 클래스 onResume() 아래로 :

@Override 
public void onResume(){ 
super.onResume(); 
this.DataAdapter.notifyDataSetChanged(); 
} 

그런데 왜이 목록을 업데이트되지 않는 이유는 무엇입니까? 데이터가 저장되었음을 확인합니다.

내 데이터 어댑터 :

public DataAdapter(Context ctxt, String[] d) { 
this.data = new String[d.length]; 
myInflater = LayoutInflater.from(ctxt); 
int i; 
for(i = 0; i < d.length; i++) { 
data[i] = d[i]; 
} 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewTag viewTag; 
if(convertView == null) { 
convertView = myInflater.inflate(R.layout.row_bookmark_list, null); 
viewTag = new ViewTag((TextView)convertView.findViewById(R.id.tv)); 
convertView.setTag(viewTag); 
} 
else { 
viewTag = (ViewTag) convertView.getTag(); 
} 
viewTag.tv.setText(data[position]); 
} 
class ViewTag { 
TextView tv; 
public ViewTag(TextView t) { 
this.tv = t; 
} 
} 
+0

시도해보십시오 .BookmarkAdapter = new NASFilesAdapter (this, d); \t this.setListAdapter (BookmarkAdapter); listadapter를 다시 표시하여 목록을 표시합니다. 이 일에 대해 어떤 단점이 있습니까? – brian

답변

12

어댑터하지에 'D'에 직접 새로운 데이터를 추가합니다. 어댑터는 내부 데이터를 유지하므로 'd'에 적용한 모든 변경 사항은 어댑터에 영향을 미치지 않습니다. 예를 들어

:

List<String> itemsList = new ArrayList<String>(); 
ArrayAdapter aa = new ArrayAdapter(..., itemsList); 
... 
itemsList.add("new item"); --> wrong! 
aa.notifyDataSetChanged(); --> nothing changes, you wrongly added the item to itemsList 

당신은 어댑터와 직접 거래 할 수 있습니다

aa.add("new item");   --> correct 
aa.notifyDataSetChanged(); --> the adapter will reflect the change 
+0

새 데이터를 어댑터에 직접 추가하는 방법은 무엇입니까? – brian

+0

내 대답을 편집했습니다 ... – gwa

+0

왜 내가 aa.add 메서드를 사용할 수 없습니까? – brian

0

당신은 같은 notifyDataSetChanged에 액세스 할 수있는
가 (당신이 무엇을 먹으 렴 정적 방법 귀하의 예에서).

ListActivity 인 경우 : getListAdapter()에 액세스 할 수 있습니다.

귀하의 데이터 세트에 대한 올바른 참조입니다. 짧은 그래서

:

getListAdapter() notifyDataSetChanged();.

트릭을 수행합니다. ListActivity가없는 경우 View.findViewById ([listview의 ID])를 통해 목록보기를 찾아서 어댑터를 가져와야합니다.

희망이

0

:-) 조금 나는 당신의 문제가 당신의 DataAdapter 배열 test에 참조하는 것을 생각 할 수 있지만, test는 변경되지 않습니다. test 대신 dataDataAdapter으로 변경하면됩니다.

확인 후 Adapter 코드를 살펴본 후 작동하지 않습니다. 왜 데이터를 복사하고 있습니까? 어댑터는 data 요소에서 변경 사항을 인식하지 못합니다. 이는 구성시에만 해당 요소의 사본으로 작동하기 때문입니다.data을 복사해야하는 경우 어댑터에서 내용을 업데이트해야합니다.

관련 문제