Listview With Customadapter Not Updated When Notifydatasetchanged Is Called?
I have a Listview with two adapters. They receive an Array with some data and when scrolled to bottom of the listview more data is loaded into the Array and here the listview shoul
Solution 1:
Try this solution ... DecorerAdapter:
publicstaticabstractclassDecorerAdapterextendsBaseAdapter {
publicint DECORER_ITEM_TYPE;
privatefinal BaseAdapter mInnerAdapter;
privatefinalint mRepeatAfterEvery;
privateint mCount;
publicDecorerAdapter(BaseAdapter innerAdapter, int repeatAfterEvery) {
mInnerAdapter = innerAdapter;
mRepeatAfterEvery = repeatAfterEvery;
mInnerAdapter.registerDataSetObserver(newDataSetObserver() {
@OverridepublicvoidonChanged() {
notifyDataSetChanged();
}
@OverridepublicvoidonInvalidated() {
notifyDataSetInvalidated();
}
});
setupAdapter();
}
@OverridepublicvoidnotifyDataSetChanged() {
setupAdapter();
super.notifyDataSetChanged();
}
privatevoidsetupAdapter(){
mCount = mInnerAdapter.getCount();
mCount += (mCount + mRepeatAfterEvery - 2) / (mRepeatAfterEvery - 1);
DECORER_ITEM_TYPE = mInnerAdapter.getViewTypeCount();
}
@OverridepublicintgetCount() {
return mCount;
}
@Overridepublic Object getItem(int position) {
if(position % mRepeatAfterEvery == 0)
returnnull;
return mInnerAdapter.getItem(calculateInnerPosition(position));
}
privateintcalculateInnerPosition(int position) {
return position - (position + mRepeatAfterEvery - 1) / mRepeatAfterEvery;
}
@OverridepubliclonggetItemId(int position) {
if(position % mRepeatAfterEvery == 0)
return -1;
return mInnerAdapter.getItemId(calculateInnerPosition(position));
}
@OverridepublicintgetItemViewType(int position) {
if(position % mRepeatAfterEvery == 0)
return DECORER_ITEM_TYPE;
return mInnerAdapter.getItemViewType(calculateInnerPosition(position));
}
@OverridepublicbooleanhasStableIds() {
return mInnerAdapter.hasStableIds();
}
@OverridepublicintgetViewTypeCount() {
return mInnerAdapter.getViewTypeCount() + 1;
}
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {
if(position % mRepeatAfterEvery == 0)
return getDecorerView((position + mRepeatAfterEvery - 1) / mRepeatAfterEvery, convertView, parent);
return mInnerAdapter.getView(calculateInnerPosition( position), convertView, parent);
}
publicabstract View getDecorerView(int position, View convertView, ViewGroup parent);
}
code with usage:
package pl.selvin.decoreradapter;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
publicclassMainActivityextendsAppCompatActivity {
/*** paste the DecorerAdapter class here ***/publicstaticclassMyListFragmentextendsListFragment{
final ArrayList<String> strings = newArrayList<>();
private BaseAdapter innerAdapter;
@OverridepublicvoidonCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add("Add rnd(10) more");
super.onCreateOptionsMenu(menu, inflater);
}
finalRandomrnd=newRandom();
@OverridepublicbooleanonOptionsItemSelected(MenuItem item) {
final String[] toAdd = newString[rnd.nextInt(10)];
intstart= strings.size();
for(inti=0; i < toAdd.length; i++)
toAdd[i] = (start + i) + "";
Collections.addAll(strings, toAdd);
Toast.makeText(getActivity(), "Added " + toAdd.length + " count: " + strings.size(), Toast.LENGTH_SHORT).show();
innerAdapter.notifyDataSetChanged();
returntrue;
}
@OverridepublicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
for(inti=0; i < 4; i++) {
strings.add(i + "");
}
innerAdapter = newArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, strings);
setListAdapter(newDecorerAdapter(innerAdapter, 5) {
@Overridepublic View getDecorerView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = newTextView(getActivity());
convertView.setBackgroundColor(Color.RED);
}
((TextView)convertView).setText("AdView: " + position);
return convertView;
}
});
}
@OverridepublicvoidonListItemClick(ListView l, View v, int position, long id) {
Stringitem= (String)l.getItemAtPosition(position);
Toast.makeText(getActivity(), "Item click: " + (item == null ? "ADVIEW" : item), Toast.LENGTH_LONG).show();
}
}
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, newMyListFragment(), "LIST").commit();
}
}
}
It repeats decorer view at every element passed to the constructor ...
all you need to do is implement getDecorerView
in the similar way as getView in normal adapter
Post a Comment for "Listview With Customadapter Not Updated When Notifydatasetchanged Is Called?"