사용자가 목록보기에서 항목을 클릭하면 선택한 listView 항목의 배경색이 수동으로 변경됩니다. 배경을 변경하는 것 이상의 계획을 세우므로 목록보기가 필요합니다.Android : notifydatachanged 목록보기를 업데이트하지 않음
문제점은 notifyDataChanged가 발생하지 않는 경우입니다. 기능에 배치 된 로그 때문에 항목을 클릭하면 onItemClick이 트리거되고 어댑터에 notifyDataSetChanged 호출이 수행되는지 확인할 수 있습니다.
데이터가 뷰에 링크되는 각 위치에 대해 "getView"를 다시 호출해야한다고 생각합니다. 그러나 이것은 발생하지 않습니다. 아무 일도 일어나지 않을 것입니다. 내가 여기서 무엇을 놓치고 있니?
class MyOnItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(final AdapterView<?> parent, View view,
final int position, long id) {
Log.i(TAG, "listview on click " + position);
MyListAdapter adapter = (MyListAdapter) parent.getAdapter();
adapter.mSelected = position;
adapter.notifyDataSetChanged();
}
}
class MyListAdapter extends BaseAdapter{
public List<String> mTxtContents;
public int mGroupCount;
public int mSelected;
public void setData(List<String> txtContents){
mTxtContents = txtContents;
mGroupCount = txtContents.size();
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
}
@Override
public void notifyDataSetChanged() {
Log.i(TAG, "notify data set changed");
// TODO Auto-generated method stub
super.notifyDataSetChanged();
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
Log.i(TAG, "nva panel group count " + mGroupCount);
return mGroupCount;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "get view, " + position);
if(convertView == null){
LayoutInflater li = LayoutInflater.from(getActivity());
convertView = li.inflate(R.layout.lvitem_navpanel, parent, false);
}
TextView tv = (TextView) convertView.findViewById(R.id.tv_txtData);
tv.setText(mTxtContents.get(position));
if(mSelected == position){
convertView.setBackgroundColor(Color.parseColor("#00FF00"));
}else{
convertView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
}
return convertView;
}
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 1;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean areAllItemsEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return true;
}
}
을 할 수 있습니다. 또한, 필요하지 않으면 registerDataSetObserver 및 unregisterDataSetObserver를 겹쳐 쓰지 마십시오. ListView는이 옵저버 메커니즘을 사용하여 notifyDataSetChanged를 호출 한 시점을 알 수 있지만 이러한 메서드를 비공개로 구현하면이 문제가 발생하지 않습니다. BaseAdapter가 당신을 대신해 주도록하십시오. –
나는 당신의 대답이 작동하지 않을 것이라고 생각했지만 ... :) 그 일을 한 부분은 register/unreigster 함수의 재정의를 삭제하는 것입니다. getItem() 함수를 삭제해도 Log에 영향을주지 않았습니다. 이클립스는 super 함수를 호출하지 않고 unregister/register 함수를 자동으로 채웠다. 그리고리스트 뷰를 깨뜨렸다 고 생각한다. 이 질문을 답으로 쓰려면 올바른 것으로 표시하겠습니다. – NameSpace