java集合-List的神奇地方

1.List a = new ArrayList();

2.a = JsonUtils.parseJsonArray();

很普通,没毛病。

可是当你设置的关联的adapter是SimpleAdapter而不是BaseAdapter时就苦逼了,再怎么notifyDataSetChanged()也没用,就是不能显示数据。

因为SimPleAdapter此时关联的集合指向的是new的集合,后来的是重新指向的,所以此时的集合改变并不会引起重绘,如果是BaseAdapter就可以,每次都会重绘,前提是使用的集合必须是改变着的那个

初始化:

//固定的项的数据集合
private List<HashMap<String,Object>> mStickItemData = new ArrayList<>();
//可拖动的GridView的数据集合
private List<HashMap<String, Object>> mHasSelectedData = new ArrayList<>();
//不可拖动的GridView的数据集合
private List<HashMap<String, Object>> mAddDataList = new ArrayList<>();
适配器:

private class MyDragAdapter extends DragAdapter{

//        private List<HashMap<String, Object>> mList ;

        public MyDragAdapter(Context context, List<HashMap<String, Object>> list) {
            super(context, list);
        }

        @Override
        public int getCount() {
            return mHasSelectedData.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            super.getView(position,convertView,parent);
            convertView = View.inflate(CategoryOrder.this,R.layout.grid_item, null);

            TextView mTextView = (TextView) convertView.findViewById(R.id.item_text);
            mTextView.setText((String) mHasSelectedData.get(position).get("name"));
            //?个固定(背景色改变不一样)
            if (position < CategoryOrder.SETTLED_ITEM_NUM) {
                convertView.setEnabled(false);
            }

            return convertView;
        }
    }
像这个,构造方法里的集合是初始化的时候传进来的,只是个中间集合,并不是最初的时刻改变的集合,表面上他确实是指向他的,可是经实践,初始的集合再怎么改变,notifyDataSetChanged()之后并不会执行getView方法!因为能够引起重绘的必须是初始的那个集合,不能是中间指向。(上文是我已经改好的)

再重新赋值(指向)之后,要调用addAll把数据传给初始集合,这样就行了。我想这也是addAll()方法存在的意义吧,否则如果可以直接赋指向的话那为什么还需要有这个方法?顿时好像明白了什么,可是具体什么原理并不清楚。

附解析数据代码:

public void getCategoryData() {
    //调接口
    new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                final JSONObject jsobj = BaseDataService.getCategoryData(UserInfo.USER_ID);
                int code = jsobj.getInt("code");
                if (code == 100) {
                    mStickItemData = JsonUtils.parseJsonArray(jsobj.getJSONArray("results"));
                    SETTLED_ITEM_NUM = mStickItemData.size() ;
                    List li = JsonUtils.parseJsonArray(jsobj.getJSONArray("results2"));
                    mHasSelectedData.addAll(li);
                    for (int i = 0; i < mStickItemData.size(); i++) {
                        HashMap map = mStickItemData.get(i);
                        mHasSelectedData.add(i,map);
                    }
                    List ll = JsonUtils.parseJsonArray(jsobj.getJSONArray("results3"));
                    mAddDataList.addAll(ll);

                    //更新UI
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mDragAdapter.notifyDataSetChanged();
                            mSimpleAdapter.notifyDataSetChanged();
                        }
                    });
                } else {
                }
            } catch (NetConnectionException e) {
                //服务器未开或者其他服务器原因引起
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(TheApplication.getContext(), "服务器链接异常", Toast.LENGTH_SHORT).show();
                    }
                });
                e.printStackTrace();
            } catch (JSONException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(TheApplication.getContext(), "Json解析错误", Toast.LENGTH_SHORT).show();
                    }
                });
                e.printStackTrace();
            } finally {
            }
        }
    }).start();

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值