[英]I can not save a position in listView when scrolling
I have my adapter which I load data 我有我的适配器,可以加载数据
public void setData(ArrayList<Map<String, Object>> data1)
{
data=data1;
sAdapter = new MyAdapter(getActivity(), data);
setListAdapter(sAdapter);
sAdapter.notifyDataSetChanged();
loadingRequested=false;
}
when I scroll loadable data listView . 当我滚动可加载的数据listView时。 they boot fine, but the listView returns to the beginning. 他们启动正常,但listView返回到开头。 I need to download new data listView remained the same position. 我需要下载新数据,listView保持不变。
public void addData(ArrayList<Map<String, Object>> data1)
{
sAdapter.getData().addAll(data1);
setListAdapter(sAdapter);
sAdapter.notifyDataSetChanged();
loadingRequested=false;
}
getData () method returns me the data from the adapter getData()方法从适配器返回我的数据
public MyAdapter(Activity context, List<Map<String, Object>> datas) {
super(context, R.layout.items, datas.subList(0,datas.size()/2));
this.context = context;
this.datas = datas;
}
public ArrayList<Map<String, Object>> getData(){
return (ArrayList<Map<String, Object>>) this.datas;
}
error logs 错误日志
04-03 10:17:43.421: ERROR/AndroidRuntime(21591): FATAL EXCEPTION: main
java.util.ConcurrentModificationException
at java.util.AbstractList$SubAbstractList.size(AbstractList.java:360)
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.ListView.setAdapter(ListView.java:460)
at android.app.ListFragment.setListAdapter(ListFragment.java:240)
at com.example.GoogleMemu.MyActivity$PlanetFragment.addData(MyActivity.java:226)
at com.example.GoogleMemu.MyActivity$2.onDone(MyActivity.java:123)
at com.example.GoogleMemu.NewThread.onPostExecute(NewThread.java:109)
at com.example.GoogleMemu.NewThread.onPostExecute(NewThread.java:22)
at android.os.AsyncTask.finish(AsyncTask.java:602)
at android.os.AsyncTask.access$600(AsyncTask.java:156)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4464)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
at dalvik.system.NativeStart.main(Native Method)
my adapter 我的适配器
public class MyAdapter extends ArrayAdapter<Map<String, Object>> implements View.OnClickListener {
private final Activity context;
private final List<Map<String, Object>> datas;
public MyAdapter(Activity context, List<Map<String, Object>> datas) {
super(context, R.layout.items, datas.subList(0,datas.size()/2));
this.context = context;
this.datas = datas;
}
public ArrayList<Map<String, Object>> getData(){
return (ArrayList<Map<String, Object>>) this.datas;
}
class ViewHolder {
public ImageView ivImage;
public ImageView ivImage2;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
final Map<String, Object> itemData = datas.get(position*2);
final Map<String, Object> itemData2 = datas.get(position*2+1);
Bitmap bitmap2 = null;
Bitmap bitmap = (Bitmap) itemData.get("img");
if(itemData2!=null)
bitmap2 = (Bitmap) itemData2.get("img");
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.items, null, true);
holder = new ViewHolder();
holder.ivImage = (ImageView) rowView.findViewById(R.id.imageView);
holder.ivImage2 = (ImageView) rowView.findViewById(R.id.imageView1);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
holder.ivImage.setImageBitmap(bitmap);
holder.ivImage2.setImageBitmap(bitmap2);
holder.ivImage.setTag(position*2);
holder.ivImage2.setTag(position*2+1);
holder.ivImage.setOnClickListener(this);
holder.ivImage2.setOnClickListener(this);
return rowView;
}
@Override
public void onClick(View v) {
Photo.openImage(MyActivity.context, datas.get((Integer)v.getTag()).get(MyActivity.ATTRIBUTE_NAME_TEXT).toString());
Log.d("HZ","test"+datas.get((Integer)v.getTag()).get(MyActivity.ATTRIBUTE_NAME_TEXT).toString());
}
}
public void addNewData(List<Map<String, Object>> dataNew)
{
this.datas.addAll(dataNew);
}
and in MyActivity 在MyActivity中
public void addData(ArrayList<Map<String, Object>> data1)
{
Log.d("HZ1","addData begin");
sAdapter.addNewData(data1);
sAdapter.notifyDataSetChanged();
loadingRequested=false;
Log.d("HZ1","addData end");
}
MyActivity code MyActivity代码
//----------------------------------------------//
/**
* Fragment that appears in the "content_frame", shows a planet
*/
public static class PlanetFragment extends ListFragment{
MyAdapter sAdapter;
static ArrayList<Map<String, Object>> data = null;
boolean loadingRequested;
public void setData(ArrayList<Map<String, Object>> data1)
{
Log.d("HZ1","setData begin");
data=data1;
sAdapter = new MyAdapter(getActivity(), data);
setListAdapter(sAdapter);
sAdapter.notifyDataSetChanged();
loadingRequested=false;
Log.d("HZ1","setData end");
}
public void addData(ArrayList<Map<String, Object>> data1)
{
Log.d("HZ1","addData begin");
sAdapter.addNewData(data1);
loadingRequested=false;
Log.d("HZ1","addData end");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
loadingRequested = true;
getListView().setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(data==null || loadingRequested) return;
if (firstVisibleItem + visibleItemCount >= totalItemCount) {
loadingRequested=true;
requestMoreImages(PlanetFragment.this);
}
}
});
if(data!=null)
{
sAdapter = new MyAdapter(getActivity(), data);
sAdapter.notifyDataSetChanged();
setListAdapter(sAdapter);
}
loadingRequested=false;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.videolist, null);
}
}
Try following Code : 尝试以下代码:
As you are using ArrayList which is already used in adapter so it is firing ConcurrentModificationException
. 当您使用已在适配器中使用的ArrayList时,它将触发ConcurrentModificationException
。
Add this method in your Adapter class 在您的Adapter类中添加此方法
public class MyAdapter extends ArrayAdapter<Map<String, Object>> implements View.OnClickListener {
// Your adapter Code. ********Add Following Code
public void addData(ArrayList<Map<String, Object>> data1) {
datas.addAll(data1);
notifyDataSetChanged();
}
}
Replace this method with your AddData method in Activity Class. 用Activity类中的AddData方法替换此方法。
public void addData(ArrayList<Map<String, Object>> data1) {
sAdapter.addData(data1);
loadingRequested=false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.