简体   繁体   English

滚动时我无法在listView中保存位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM