如何更新Listview中的特定行

时间:2015-07-09 10:39:18

标签: android json android-listview adapter

我已经实现了垂直滚动的列表视图,每行中都有像apple,lemon等项目,这些项目是水平滚动的。现在我的问题是我需要对所选行中的项进行排序,我需要将结果更新到该行,这里我无法将值更新到特定行。第一次我将数据从活动加载到适配器和排序值我正在加载适配器类。

这里的代码是..

public static ArrayList<GroupsModel> CustomListViewValuesArr;
        public static ArrayList<ItemsModel> ItemsArr;

        public MyDisplay_Adapter(Context a, ArrayList d) {

            context = a;
            data = d;

            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        }

        public int getCount() {
            if (data.size() <= 0)
                return 1;
            return data.size();
        }

        public final Object getItem(int position) {
            return data.get(position);
        }

        public final long getItemId(int position) {
            return position;
        }

        public static class ViewHolder {

            public TextView tvGroupTitle, tvGroupDescription, 
            public LinearLayout imgscrollchild;

        }

        public View getView(final int position, View convertView, ViewGroup parent) {

            Log.d("getview:", "position=" + position);
            vi = convertView;
            final ViewHolder holder;

            if (convertView == null) {

                vi = inflater.inflate(R.layout.my_asset_list_item, null);
                holder = new ViewHolder();

                holder.tvGroupTitle = (TextView) vi.findViewById(R.id.tvGroupTitle);

                holder.tvGroupDescription = (TextView) vi
                        .findViewById(R.id.tvGroupDescription);
                holder.imgscrollchild = (LinearLayout) vi
                        .findViewById(R.id.imgscrollchild);

                vi.setTag(holder);

            } else {

                holder = (ViewHolder) vi.getTag();

            }
            if (data.size() <= 0) {

                vi.setVisibility(View.GONE);

            } else {

                tempValues = null;
                tempValues = (GroupsModel) data.get(position);

                holder.tvGroupTitle.setText(tempValues.getName().toString());
                holder.tvGroupDescription.setText(tempValues.getDescription()
                        .toString());


                if (tempValues.getItemmodel().size() == 0) {

                    return vi;

                } else {

                    for (int i = 0; i < tempValues.getItemmodel().size(); i++) {

                        a = i;
                        Log.i("Index", String.valueOf(i));
                        holder.imgscrollchild.addView(createimg(
                                tempValues.getItemmodel(), a));
                        Log.i("Index A", String.valueOf(a));

                    }
                }

            }
            return vi;
        }

        @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
        public View createimg(final List<ItemsModel> bm, final int pos) {

            Here dynamically creating a imageview and textview


            return Hlayout;

        }



        private class Sort extends AsyncTask<String, Void, String> {

            @Override
            protected String doInBackground(String... params) {
                String json = null;

                try {

                    String url_get = "my url"

                    HttpClient httpclient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(url_get);
                    HttpResponse response = httpclient.execute(httpGet);
                    StatusLine statusLine = response.getStatusLine();

                    int statusCode = statusLine.getStatusCode();
                    if (statusCode == 200) {

                        HttpEntity entity = response.getEntity();
                        json = EntityUtils.toString(entity);

                        try {

                            JSONArray array = new JSONArray(json);
                            ItemsArr = new ArrayList<ItemsModel>();
                            for (int i = 0; i < array.length(); i++) {

                                JSONObject Obj = array.getJSONObject(i);

                                String GName = Obj.getString("GName");
                                String GDesc = Obj.getString("GDesc");

                                ItemsArr.add(ItemsList);

                            }

                            GroupsModel list1 = new GroupsModel();
                            list1.setItemmodel(ItemsArr);
                            CustomListViewValuesArr = new ArrayList<GroupsModel>();
                            CustomListViewValuesArr.add(list1);

                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.e("Exception", e.toString());
                        }

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {

                adapter = new MyDisplay_Adapter(context,CustomListViewValuesArr);
                adapter.notifyDataSetChanged();

            }
        }



        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    }

2 个答案:

答案 0 :(得分:2)

您不应该在异步任务的postExecute上创建新的适配器实例。你sholud创建一个方法来改变适配器上的数据。并在PostExecute上调用它,如:

    adapter.setData(myData);

    adaptar.notifyDatasetChanged();

如果您不想这样做,如果您需要重新创建适配器,则应将其重置为:

    listView.setAdapter(adapter);

注意:代码示例可能与确切代码不同。

答案 1 :(得分:0)

将更新的对象更新为arraylist 您可以通过清除arraylist中的所有数据并将更新的数据添加到同一列表中来完成此操作 您可以通过检查要替换的对象来执行此操作 并使用 adapter.notifyDataSetChanged();