如何存储多个 JSON 数组的项目并显示它的列表视图?

Posted

技术标签:

【中文标题】如何存储多个 JSON 数组的项目并显示它的列表视图?【英文标题】:How to store items of multiple JSON Array and display it listview? 【发布时间】:2016-01-30 10:47:34 【问题描述】:

在我的应用程序中,我使用的是 listview,我也在做 json 解析。

现在的问题是我想在我的视图中设置颜色,即我从服务器获取的颜色代码。

以下是我的 json 响应和 java 代码,任何人都可以帮助我在我的视图中设置颜色代码吗?

[
    
        "id_product": "1445",
        "name": "Stylish Sleeveless Leather Vest",
        "price": 1990,
        "discount": 199,
        "colors": [
            "#000000",
            "#7E3517",
            "#C85A17"
        ],
        "sizes": [
            "Medium",
            "Large",
            "Small"
        ],
        "img_url": "",
        "popup_images": [

        ]
    ,
    
        "id_product": "1427",
        "name": "Stylish Slim Fit Designed PU Leather Jacket",
        "price": 3290,
        "discount": 329,
        "colors": [
            "#000000",
            "#C85A17"
        ],
        "sizes": [
            "Large",
            "Medium",
            "Small"
        ],
        "img_url": "",
        "popup_images": [

        ]
    
]

MainActivity.java

public class Product_Listing extends Fragment

    private ListView listview;


    private ArrayList<HashMap<String,String>> aList;
    private static String INTEREST_ACCEPT_URL = "";
   // private static final String INTEREST_ACCEPT="interestaccept";
    private static final String INTERESTACCEPT_USER_NAME="name";
    private static final String INTEREST_ACCEPT_PRICE="price";
    private static final String INTEREST_ACCEPT_PRODUCTID="id_product";
   private static final String INTEREST_ACCEPT_DISCOUNT="discount";
    private static final String INTEREST_ACCEPT_IMAGEURL="img_url";
    private static final String INTEREST_ACCEPT_COLOR="colors";
    private static final String INTEREST_ACCEPT_SIZES="sizes";
    private CustomAdapterAccept adapter;


    private String brandnms;
    String user_img;
    ArrayList<String> userImgArrayList;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
         View rootView = inflater.inflate(R.layout.product_listing_listivew, container, false);


         Bundle bundle = this.getArguments();
            brandnms = bundle.getString("Brandkeyword");
         listview=(ListView)rootView.findViewById(R.id.listview_productlistings);

            INTEREST_ACCEPT_URL = "";

            new LoadAlbums().execute();

         return rootView;
    

    public class CustomAdapterAccept extends BaseAdapter

        private Context context;
        private ArrayList<HashMap<String,String>> listData;
        private AQuery aQuery;
        String rup="\u20B9";
        private static final String TAG_NAME="name";
       private static final String TAG_IMAGE="img_url";
        private static final String TAG_PRICE="price";


        public CustomAdapterAccept(Context context,ArrayList<HashMap<String,String>> listData) 
            this.context = context;
            this.listData=listData;
            aQuery = new AQuery(this.context);
        

        @Override
        public int getCount() 
            return listData.size();
        

        @Override
        public Object getItem(int position) 
            return listData.get(position);
        


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

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) 
            ViewHolder holder;
            if (convertView == null) 
                holder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.product_listing_items, null);
               holder.propic = (ImageView) convertView.findViewById(R.id.productlist_img);
                holder.txtproname = (TextView) convertView.findViewById(R.id.productlist_name);
                holder.txtprice = (TextView) convertView.findViewById(R.id.productlist_price);
               // holder.txtpr = (TextView) convertView.findViewById(R.id.productlist_name);


                convertView.setTag(holder);
            else
                holder = (ViewHolder) convertView.getTag();
            
            holder.txtproname.setText(listData.get(position).get(TAG_NAME));
            holder.txtprice.setText(listData.get(position).get(TAG_PRICE));


            aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE),true,true,0,R.drawable.meracaslogo);

            // image parameter : 1 : memory cache,2:file cache,3:target width,4:fallback image
            return convertView;
        
        class ViewHolder
            TextView txtprice;
            ImageView propic;
            TextView txtproname;
        

    
    class LoadAlbums extends AsyncTask<String, String, ArrayList<HashMap<String,String>>> 
        private ProgressDialog pDialog;
        private String first;
        private String sizefirst;
        private JSONObject c;

        @Override
        protected void onPreExecute() 
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading...");
            pDialog.setIndeterminate(true);
           // pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));
            pDialog.setCancelable(false);
            pDialog.show();
        
        protected ArrayList<HashMap<String,String>> doInBackground(String... args) 
            ServiceHandler sh = new ServiceHandler();
            // Making a request to url and getting response
            ArrayList<HashMap<String,String>> data = new ArrayList<HashMap<String, String>>();
            String jsonStr = sh.makeServiceCall(INTEREST_ACCEPT_URL, ServiceHandler.GET);

            Log.d("Response: ", "> " + jsonStr);

            if (jsonStr != null) 
                try 
                    JSONArray jsonary = new JSONArray(jsonStr);

                    System.out.println("Test jsonObj"+jsonary);

                    // Getting JSON Array node
                  // interestaccept = jsonObj.getJSONArray(INTEREST_ACCEPT);

                    for (int i = 0; i < jsonary.length(); i++) 
                        c = jsonary.getJSONObject(i);
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
                        // adding each child node to HashMap key => value
                        map.put(INTERESTACCEPT_USER_NAME, c.getString(INTERESTACCEPT_USER_NAME));
                        map.put(INTEREST_ACCEPT_PRICE,c.getString(INTEREST_ACCEPT_PRICE));
                        map.put(INTEREST_ACCEPT_DISCOUNT, c.getString(INTEREST_ACCEPT_DISCOUNT));
                        map.put(INTEREST_ACCEPT_PRODUCTID, c.getString(INTEREST_ACCEPT_PRODUCTID));
                        map.put(INTEREST_ACCEPT_IMAGEURL, c.getString(INTEREST_ACCEPT_IMAGEURL));
                        //map.put(INTEREST_ACCEPT_AGE, c.getString(INTEREST_ACCEPT_AGE)+" years");
                        //map.put(INTEREST_ACCEPT_LOCATION, c.getString(INTEREST_ACCEPT_LOCATION));
                        // adding HashList to ArrayList

                        JSONArray colors=c.getJSONArray(INTEREST_ACCEPT_COLOR);
                        JSONArray sizes=c.getJSONArray(INTEREST_ACCEPT_SIZES);

                        user_img=c.getString(INTEREST_ACCEPT_COLOR);

                       // user_img=jsonObj.getString(USER_IMG);


                        user_img = "";
                        userImgArrayList = new ArrayList<String>();//declare userImgArrayList globally like ArrayList<String> userImgArrayList;
                        JSONArray picarray = c.getJSONArray(INTEREST_ACCEPT_COLOR);
                        for(int a=0;a< picarray.length();a++)
                        
                            user_img = picarray.getString(a);
                            userImgArrayList.add(user_img);
                        
                        Log.d("mylog", "curent  pro pic  = " + userImgArrayList);

                        first=userImgArrayList.get(i);
                        System.out.println("Color First"+first);

                        //first=colors.getJSONObject(a);

                       /* for(int j=0;j<colors.length();j++)
                        
                            //first=colors.getJSONObject(j);

                        

                        for(int s=0;s<sizes.length();s++)
                        
                            sizefirst=sizes.getString(s);
                        
                        System.out.println("Color First"+first);

                        System.out.println("Colors"+colors);*/
                        data.add(map);
                    


                 catch (JSONException e) 
                    e.printStackTrace();
                
             else 
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            
            return data;
        
        protected void onPostExecute(ArrayList<HashMap<String,String>> result) 
            super.onPostExecute(result);

            // dismiss the dialog after getting all albums
            if (pDialog.isShowing())
                pDialog.dismiss();
            // updating UI from Background Thread
                aList = new ArrayList<HashMap<String, String>>();
                aList.addAll(result);
                adapter = new CustomAdapterAccept(getActivity(),result);
                listview.setAdapter(adapter);
                adapter.notifyDataSetChanged();

        

    


列表项

 <LinearLayout
        android:layout_
        android:layout_
        android:layout_marginLeft="25dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_
            android:layout_
            android:layout_gravity="center_vertical"
            android:text="Colors:" />

        <TextView
            android:id="@+id/firstcolor"
            android:layout_
            android:layout_
            android:layout_marginLeft="7dp"
             />

        <TextView
            android:id="@+id/secondcolor"
            android:layout_
            android:layout_
            android:layout_marginLeft="5dp"
             />

        <TextView
            android:id="@+id/thirdcolor"
            android:layout_
            android:layout_
            android:layout_marginLeft="5dp"
             />

        <TextView
            android:id="@+id/fourthcolor"
            android:layout_
            android:layout_
            android:layout_marginLeft="5dp"
             />
    </LinearLayout>

【问题讨论】:

【参考方案1】:

使用以下代码获取颜色的ArrayList

ArrayList<String> colorsList = new ArrayList<>();
JsonArray jarr = new JsonArray(result);

for(int i=0;i<jarr.length;i++)

  JsonArray color = jarr.get("colors");
  String myColor="";
  for(int k=0;k<color.length;k++)
    myColor = color.getString(k)+",";
  
  colorsList.add(myColor);

从这段代码中,您可以得到 ArrayList,其中每个对象都包含逗号分隔的颜色作为字符串。

使用此列表填充您的列表适配器,并在您的列表中获取每种颜色并用逗号分隔并将其用作背景颜色。

【讨论】:

【参考方案2】:

在适配器内部-> getview 方法为您的视图充气并设置以下代码

view.setBackgroundColor(yourColorCode);

您可以从解析的 json 中获取您的颜色代码。

编辑: 在 getView 方法中

getView(parameters)

your_current_object=objectList.get(position);
color_arraylist=your_current_object.colorsList;

if(color_arraylist.get(0)!=null)
textview1.setBackgroundColor(color_arraylist.get(0));
if(color_arraylist.get(1)!=null)
textview2.setBackgroundColor(color_arraylist.get(1));

//....so on..


如果 color_arraylist.get(position) 不能作为参数直接传递给 setBackgroundColor(),则进行适当的类型转换。但我希望它可以在没有任何类型转换的情况下工作。

【讨论】:

@Harikishan 我的列表项中有 textview ..在我的数组列表中,我得到了所有响应的颜色代码..所以我想根据索引进行设置..就像第一个数组三颜色在那里..所以在我的第一项中我想在我的文本视图中设置它们,..然后在第二项中我有两个颜色代码所以我想在我的第二项中设置这两个颜色代码.. 好的。在解析 json 时,在字符串数组列表中设置颜色,您可以通过从各自位置获取颜色来将每种颜色设置为每个文本视图【参考方案3】:

您可以根据下面的 JSON 响应设置列表视图的行颜色:

@Override
        public View getView(final int position, View convertView, ViewGroup parent) 
            ViewHolder holder;
            if (convertView == null) 
                holder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.product_listing_items, null);
               holder.propic = (ImageView) convertView.findViewById(R.id.productlist_img);
                holder.txtproname = (TextView) convertView.findViewById(R.id.productlist_name);
                holder.txtprice = (TextView) convertView.findViewById(R.id.productlist_price);
               // holder.txtpr = (TextView) convertView.findViewById(R.id.productlist_name);


                convertView.setTag(holder);
            else

               **Add you code here for color.**       

                view.setBackgroundColor(listData.get(position).get(INTEREST_ACCEPT_COLOR));
                holder = (ViewHolder) convertView.getTag();
            
            holder.txtproname.setText(listData.get(position).get(TAG_NAME));
            holder.txtprice.setText(listData.get(position).get(TAG_PRICE));


            aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE),true,true,0,R.drawable.meracaslogo);

            // image parameter : 1 : memory cache,2:file cache,3:target width,4:fallback image
            return convertView;
        

编辑:

为了向您的 TextView 显示颜色,您应该首先将所有颜色放入 Hashmap 并将该 hashmap 传递给您的适配器。

现在,您可以根据键为 Textview 设置颜色。

HashMap<String, String> hashmap;

ArrayList中传递Hashmap的方法

public ArrayList<HashMap<String, String>> getAllColor(String firstcolor , String second color , String thirdcolor)
    
        ArrayList<HashMap<String, String>> array_list = new ArrayList<HashMap<String, String>>();


            hashmap = new HashMap<String, String>();
            hashmap.put("firstcolor", firstcolor);
            hashmap.put("second color",secondcolor);
            hashmap.put("thirdcolor",thirdcolor);

            array_list.add(hashmap);

        
        return array_list;
    

现在调用这个方法来传递你的颜色。并将您的 Arraylist 传递给您的 ADAPTER .。在 getView() 方法中,您可以通过如下键检索它:

**ArrayList&lt;HashMap&lt;String, String&gt;&gt; arrayList;** // 全局声明

arrayList = "Your adapterList"; // 在适配器的构造函数中声明

在 getView() 中:

if (arrayList.size() != 0)
            
                for (int i = 0; i < arrayList.size(); i++)
                
                    textView1.setBackgroundColor(arrayList.get(i).get("firstcolor"));
                    textView2.setBackgroundColor(arrayList.get(i).get("secondcolor"));
                    textView3.setBackgroundColor(arrayList.get(i).get("thirdcolor"));

                
             

希望这次能解决你的问题。

【讨论】:

我的 textview 和 txtprice 一样..设置我的颜色..如何设置? 那么你想在哪里设置颜色,我的意思是在 TextView 的背景或 Listview 行的背景? 但我没有所有颜色的单独键 我想你在这里得到 JSONArray picarray = c.getJSONArray(INTEREST_ACCEPT_COLOR); for(int a=0;a 让我们continue this discussion in chat。

以上是关于如何存储多个 JSON 数组的项目并显示它的列表视图?的主要内容,如果未能解决你的问题,请参考以下文章

遍历非常大的 JSON 数组

获取mysql中的多条记录并存入json数组中显示在HTML表格单单字段中

如何获取json数组值并显示在angularjs的下拉列表中?

如何存储json下拉列表中的项目

后台封装成jsonarray,前台js如何接收并存储到下拉列表中,急急急。。。

如何将Javascript数组作为Json与html表单结合发送?