Yenileme Android Liste Görünümü sonra notifyDataSetChanged
ListFragment benim kod
public class ItemFragment extends ListFragment {
private DatabaseHandler dbHelper;
private static final String TITLE = "Items";
private static final String LOG_TAG = "debugger";
private ItemAdapter adapter;
private List<Item> items;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.item_fragment_list, container, false);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
getActivity().setTitle(TITLE);
dbHelper = new DatabaseHandler(getActivity());
items = dbHelper.getItems();
adapter = new ItemAdapter(getActivity().getApplicationContext(), items);
this.setListAdapter(adapter);
}
@Override
public void onResume() {
super.onResume();
items.clear();
items = dbHelper.getItems(); //reload the items from database
adapter.notifyDataSetChanged();
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if(dbHelper != null) { //item is edited
Item item = (Item) this.getListAdapter().getItem(position);
Intent intent = new Intent(getActivity(), AddItemActivity.class);
intent.putExtra(IntentConstants.ITEM, item);
startActivity(intent);
}
}
}
Benim Liste Görünümü
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Ama bu ListView
yenilemez. Hatta app yeniden başlattıktan sonra güncelleştirilmiş öğeler gösterilmez. Benim ItemAdapter
BaseAdapter
uzanır
public class ItemAdapter extends BaseAdapter{
private LayoutInflater inflater;
private List<Item> items;
private Context context;
public ProjectListItemAdapter(Context context, List<Item> items) {
super();
inflater = LayoutInflater.from(context);
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ItemViewHolder holder = null;
if(convertView == null) {
holder = new ItemViewHolder();
convertView = inflater.inflate(R.layout.list_item, parent,false);
holder.itemName = (TextView) convertView.findViewById(R.id.topText);
holder.itemLocation = (TextView) convertView.findViewById(R.id.bottomText);
convertView.setTag(holder);
} else {
holder = (ItemViewHolder) convertView.getTag();
}
holder.itemName.setText("Name: " items.get(position).getName());
holder.itemLocation.setText("Location: " items.get(position).getLocation());
if(position % 2 == 0) {
convertView.setBackgroundColor(context.getResources().getColor(R.color.evenRowColor));
} else {
convertView.setBackgroundColor(context.getResources().getColor(R.color.oddRowColor));
}
return convertView;
}
private static class ItemViewHolder {
TextView itemName;
TextView itemLocation;
}
}
Lütfen biri yardım edebilir mi?
CEVAP
ItemFragment
onResume
yönteminizi bak
@Override
public void onResume() {
super.onResume();
items.clear();
items = dbHelper.getItems(); // reload the items from database
adapter.notifyDataSetChanged();
}
sadece notifyDataSetChanged()
çağırmadan önce güncelledik ne adaptörün alan private List<Item> items;
ama parçanın aynı şekilde ilan alan değildir. Bağdaştırıcı adaptör (parça onCreate örn oluştururken geçmiş öğeleri listesi için bir başvuru depolar.
Beklediğiniz gibi kodunuzu davranmasını sağlamak için en kısa (değişiklik sayısı anlamında) ama zarif basit yolu hattı yerine taşıyor
items = dbHelper.getItems(); // reload the items from database
ile
items.addAll(dbHelper.getItems()); // reload the items from database
Daha zarif bir çözüm
1) öğe private List<Item> items;
adaptörü sadece ItemFragment
- onları referans tutmalıyız çıkarın
2) onCreate değiştirin :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setHasOptionsMenu(true);
getActivity().setTitle(TITLE);
dbHelper = new DatabaseHandler(getActivity());
adapter = new ItemAdapter(getActivity(), dbHelper.getItems());
setListAdapter(adapter);
}
3) İtemAdapter yöntemi ekleyin:
public void swapItems(List<Item> items) {
this.items = items;
notifyDataSetChanged();
}
4) onResume değiştirin:
@Override
public void onResume() {
super.onResume();
adapter.swapItems(dbHelper.getItems());
}
Android Liste Görünümü Tek Satır Yenil...
Adaptör notifyDataSetİnvalidated() And...
Nasıl Android Liste Görünümü ayırıcı ç...
Nasıl Android liste görünümü yenilemek...
Android: liste görünümü tıklatın devre...