【问题标题】:How to get the selected item id in the listview while listview is sorted according to the name?当listview根据名称排序时,如何在listview中获取所选项目的id?
【发布时间】:2016-09-07 09:30:15
【问题描述】:

我正在从 json. 获取数据并显示在列表视图中。我使用比较器根据名称对列表视图进行了排序。问题是,当我单击排序后的列表视图时,它得到的是第一个项目的 ID,而不是排序项目的 ID。谁能告诉我如何解决这个问题??

这是我的 json 数据:-

{
  "status": 1,
  "StatusMessage": "Restaurent List",
  "data": [
    {
      "ID": "7",
      "RestaurantName": "Water Lemon",
      "MinimumOrder": "20.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "8",
      "RestaurantName": "Casper and Gambini",
      "MinimumOrder": "40.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "11",
      "RestaurantName": "B L E N D S",
      "MinimumOrder": "50.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "12",
      "RestaurantName": "khyber Indian Cuisine",
      "MinimumOrder": "5.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "13",
      "RestaurantName": "Khyber Indian",
      "MinimumOrder": "5.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "14",
      "RestaurantName": "test",
      "MinimumOrder": "10.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "15",
      "RestaurantName": "yahoo",
      "MinimumOrder": "5.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },
    {
      "ID": "16",
      "RestaurantName": "Khaber",
      "MinimumOrder": "3.000",
      "DeliveryTime": "",
      "OpenStatus": true,
      "PaymentOptions": "VISA, MasterCard , Maestro , American Express",
      "Is New Restaurant": true,
      "Is Provide Offer": true
    },

这是我解析 json 并在列表视图中显示的方法():-

 public void requestRestaurantSearchByFilter_list() {
  mProgressDialog.show();
        StringRequest restrolistrequestfilter = new StringRequest(Request.Method.POST, GlobalData.SEARCHBYFILTERURL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {

                            mProgressDialog.dismiss();
                            mPaymentMethodList.clear();
                            mDataList.clear();
                            mAllList.clear();
                            mAdapter.notifyDataSetChanged();



                            JSONObject jObject = new JSONObject(response);
                            if (jObject.getString("status").equals("1")) {


                                JSONArray jsonArray = jObject.getJSONArray("data");
                                for (int i = 0; i < jsonArray.length(); i++) {


                                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                                    PojoRestaurant pojoRestaurant = new PojoRestaurant();


                                    pojoRestaurant.setRestroName(jsonObject.getString("RestaurantName"));
                                    pojoRestaurant.setDeliveryTime(jsonObject.optString("DeliveryTime"));
                                    pojoRestaurant.setPaymentOption(jsonObject.getString("PaymentOptions"));
                                    pojoRestaurant.setMinimumOrder(jsonObject.getString("MinimumOrder"));


                                    if (jsonObject.getString("ImageUrl").equals("") || jsonObject.getString("ImageUrl") == "null") {


                                    } else {


                                        pojoRestaurant.setRestroImage(jsonObject.getString("ImageUrl"));

                                    }

                                    id = jsonObject.getString("ID");

                                    pojoRestaurant.setRestroId(id);

                                    mPaymentMethodList.add(jsonObject.getString("PaymentOptions"));


                                    if (jsonObject.getString("OpenStatus").equals("true")) {

                                        pojoRestaurant.setOpenClose("Open");


                                    } else {
                                        pojoRestaurant.setOpenClose("Close");


                                    }

                                    mAllList.add(pojoRestaurant);
                                    mDataList.add(pojoRestaurant);

                                    Collections.sort(mDataList, RestaurantList.getCompByName());

                                    getpaymentId.add(id);
                                    getListViewId.add(id);
                                   }

                                mListView.setAdapter(mAdapter);
                                mAdapter.notifyDataSetChanged();

                            } else {

                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {

                        Log.e("error", "" + volleyError.getMessage());
                        if (volleyError.getMessage() == null)
                            requestRestaurantSearchByFilter_list();


                    }
                }) {


            @Override
            protected Map<String, String> getParams() throws AuthFailureError {

                Map<String, String> params = new HashMap<String, String>();

                String foodid = getArguments().getString("FOODID");
                String areaid = getArguments().getString("AREAID");



                params.put("DeliveryAreaID", areaid);
                params.put("ProvideOffers", "0");
                params.put("NewRestaurant", "0");
                params.put("PaymentMethod", "0");
                params.put("OpenRestaurant", "0");
                params.put("FoodID", foodid);

                return params;
            }


        };

        RequestQueue restrolistqueuefilter = Volley.newRequestQueue(getContext());
        restrolistrequestfilter.setShouldCache(false);
        restrolistqueuefilter.add(restrolistrequestfilter);


    } 

这是我的比较器方法(),通过它我将列表视图设置为相应的恢复名称。 :-

public static Comparator<PojoRestaurant> getCompByName() {
        Comparator<PojoRestaurant> comp = new Comparator<PojoRestaurant>() {
            @Override
            public int compare(PojoRestaurant lhs, PojoRestaurant rhs) {
                return lhs.RestroName.compareTo(rhs.RestroName);
            }
        };
        return comp;
    }

以下是列表视图上的单击列表器,我在其中获取列表视图项的位置并获取列表视图项的 id:-

 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
              mListViewItemId = getListViewId.get(i);
             Fragment fragment = new RestrurantName();
                Bundle b = new Bundle();
                b.putString("ListViewitemId", mListViewItemId);

                fragment.setArguments(b);


                getFragmentManager().beginTransaction().replace(R.id.frame, fragment).addToBackStack(null).commit();
                toolbar.setTitle("Restaurant Name");

            }
        });

其中getListViewId是字符串类型的数组列表。

这是我的适配器类:-

public class RestroListBaseAdapter extends BaseAdapter {

    private ArrayList<PojoRestaurant> mList;
    private Context mContext;
    private ViewHolder viewHolder;


    public RestroListBaseAdapter(Context mContext, ArrayList<PojoRestaurant> mList) {

        this.mContext = mContext;
        this.mList = mList;


    }


    @Override
    public int getCount() {
        if (mList != null) {
            return mList.size();

        }


        return 0;
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int lastPosition = -1;
        LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.restaurant_item, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.RestroName = (TextView) convertView.findViewById(R.id.tv_restro_name);
            viewHolder.OpenClose = (TextView) convertView.findViewById(R.id.tvOpenClose);
            viewHolder.MinimumOrder = (TextView) convertView.findViewById(R.id.tv_minimun_order);
            viewHolder.DeliveryTime = (TextView) convertView.findViewById(R.id.tv_delivery_time);
            viewHolder.PaymentOption = (TextView) convertView.findViewById(R.id.tv_Payment);
            viewHolder.RestroImage = (ImageView) convertView.findViewById(R.id.img_restro_list);


        } else {

            viewHolder = (ViewHolder) convertView.getTag();


        }


        Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
        convertView.startAnimation(animation);
        lastPosition = position;


        convertView.setTag(viewHolder);

        PojoRestaurant pojoRestaurant = (PojoRestaurant) getItem(position);

        viewHolder.RestroName.setText(pojoRestaurant.getRestroName());
        viewHolder.DeliveryTime.setText(pojoRestaurant.getDeliveryTime());
        viewHolder.MinimumOrder.setText(pojoRestaurant.getMinimumOrder());
        viewHolder.OpenClose.setText(pojoRestaurant.getOpenClose());
        viewHolder.PaymentOption.setText(pojoRestaurant.getPaymentOption());
        Picasso.with(mContext).load(pojoRestaurant.getRestroImage()).into(viewHolder.RestroImage);


        return convertView;
    }



    private class ViewHolder {
        private TextView RestroName, OpenClose, MinimumOrder, DeliveryTime, PaymentOption;
        private ImageView RestroImage;

    }


}

问题:- 当我从列表视图中选择项目时,id (mListViewItemId) 将对应于 json id。我希望当我选择特定项目时,它需要该项目的 id。 在我的情况下,当我选择 Restro 名称(B L E N D S)时,它采用 id 7。请查看我的 json 并告诉我该怎么做??

【问题讨论】:

  • 你能发布你的适配器吗?
  • 实际上您的恢复名称很短,但 id 并没有缩短,这就是您出错的原因。尝试从列表视图项中查找 id 的位置,然后获取 id .. 它会起作用
  • @Ashish 你是对的!但我不知道我该怎么做!你能告诉我吗?

标签: android json listview android-volley


【解决方案1】:

从您的代码中,我可以看到您已经对 mDataList 数组列表进行了排序以获取排序列表。但是您已将 id 列表存储在单独的列表中,即 getListViewId 您尚未排序。

如果您对mDataList 进行排序,那么您还必须对getListViewId 列表进行排序以获得正确的列表。

但我建议您仅从您的mDataList 获取列表项 ID,如下所示

    mListViewItemId = mDataList.get(i).getRestroId();

希望这将为您提供指导。如果有任何疑问,请告诉我。

【讨论】:

  • 由此 mListViewItemId = mDataList.get(i).getRestroId();它给出了restro名称而不是id。还有一件事我如何对 getListViewId 进行排序,其中 getListViewId 是字符串类型的数组列表。
  • @LoveAndroid 您已经将restroid 存储在您的列表视图中。您只能通过所选列表项的位置来获取它。只需尝试onItemClick 侦听器中的代码行。
  • @LoveAndroid 欢迎! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多