5

I have a DataList jsonarray with a jsonobject as Data , the string has different values which is seprated by character "´" , the values are respectively corresponding to the "Headers" object , i need to display this in a recycler view as SL.,InNo,etc., how can i achieve this by spliting the characher "´" which gives a string array,i furthur need to display this data from adapter to different textview, any ideas would be really helpful.

   "MainData": {
       "Headers": "SL.>´InNo. - Supp<´InvNo.<´Date^´Value>´Disc.>´Rate´Others>´Amount>",
       "FieldSeparator": "´",
       "DataList": [
           {
               "Data": "1. ´19110 / Textiles´003220´01-sep-2019´70,605.00´0.00´530.25´982.75´118.00´",
               "DataInputType": 1
           },
            {
               "Data": "2. ´19111 / Textiles´7041´01-sep-2019´8,895.00´0.00´444.75´173.25´513.00´",
               "DataInputType": 1
           },

Android_id
  • 1,521
  • 1
  • 15
  • 33

3 Answers3

2

You have multiply approaches in order to preform that task,

first of all extract the needed information into string then you can use

replace function to change '`' into '' read more about string handling in java

extraction: Converting JSON data to Java object

replace function: How to remove special characters from a string?

dt170
  • 417
  • 2
  • 12
2

Assuming you want your data to be in a usable structure like that.

 [
    {
        "SL" : "1"
        "InNo": "19910"
        ...
    },
    {
        "SL" : "2"
        "InNo": "19911"
        ...
    }

 ]

As others have mentioned the idea is to use the split("´") the rest are how you want to structure you data.

Use a class or a method to create the above structure:

public class DefineData {

// Assuming the below desired structure

// [
//    {
//        SL : 1
//        InNo: 19910
//        ...
//    },
//    {
//        SL : 2
//        InNo: 19911
//        ...
//    }
//
// ]

private ArrayList<HashMap<String, String>> dataArrayList;

// Helper method please use your own JsonObject instead of that method
public JSONObject getJsonObject() {
    String json = "{ \"MainData\":{ \"Headers\":\"SL.>´InNo. - Supp<´InvNo.<´Date^´Value>´Disc.>´Rate´Others>´Amount>\", \"FieldSeparator\":\"´\", \"DataList\": [ { \"Data\": \"1. ´19110 / Textiles´003220´01-sep-2019´70,605.00´0.00´530.25´982.75´118.00´\", \"DataInputType\":1 }, { \"Data\":\"2. ´19111 / Textiles´7041´01-sep-2019´8,895.00´0.00´444.75´173.25´513.00´\", \"DataInputType\":1 }] } }";
    try {
        JSONObject obj = new JSONObject(json);
        return obj;
    } catch (Throwable tx) {
        Log.e("TAG", "getJsonObject: ", tx.getCause());
        throw new RuntimeException("");
    }
}

public DefineData() throws JSONException {
    dataArrayList = new ArrayList<>();


    // Assuming everything is a String for now
    JSONObject obj = getJsonObject();
    JSONObject mainData = obj.getJSONObject("MainData");
    String headers = mainData.getString("Headers");
    // In your case "´" but it's a good practise to grab that from the JsonObject
    String fieldSeparator = mainData.getString("FieldSeparator");
    JSONArray dataList = mainData.getJSONArray("DataList");

    // Loop through dataList and populate the data map and split the data using the FieldSeparator
    String[] headersArray = headers.split(fieldSeparator);

    for (int i = 0; i < dataList.length(); i++) {
        JSONObject dataJsonObject = dataList.getJSONObject(i);
        String dataString = dataJsonObject.getString("Data");
        String[] dataArray = dataString.split(fieldSeparator);
        // Loop through the dataArray
        HashMap<String, String> dataMap = new HashMap<>();
        for (int j = 0; j < dataArray.length; j++) {
            String dataItem = dataArray[j];
            String header = headersArray[j];
            dataMap.put(dataItem, header);
        }
        dataArrayList.add(dataMap);
    }

}

public ArrayList<HashMap<String, String>> getDataArrayList() {
    return dataArrayList;
}
}

Your Adapter for the RecyclerView should look similar to that:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private ArrayList<HashMap<String, String>> dataArrayList;

public MyAdapter(ArrayList<HashMap<String, String>> dataArrayList) {
    this.dataArrayList = dataArrayList;
}

@Override
public int getItemCount() {
    return dataArrayList.size();
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // Your root layout here instead of view..
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_item, parent, false);

    // TextView txtView = view.findViewById(R.id.textView);

    MyViewHolder vh = new MyViewHolder(view);
    // vh.textView = txtView;
    return vh;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    // The position will be similar to DataList position but this time we have the
    // information from the header
    HashMap<String, String> key = dataArrayList.get(position);

    //String slVal = key.get("SL");
    //String inNoVal = key.get("InNo");
    // Or simply iterate through them whatever works best

    holder.textView.setText("The desired value");
    // Do the same for the rest..
}


// VIEW HOLDER

public static class MyViewHolder extends RecyclerView.ViewHolder {
    public View view;
    public TextView textView;
    // Views....
    // Pass in your view or layout - RelativeLayout, ConstraintLayout
    public MyViewHolder(View view) {
        super(view);
        this.view = view;
    }
}


public ArrayList<HashMap<String, String>> getDataArrayList() {
    return dataArrayList;
}

public void setDataArrayList(ArrayList<HashMap<String, String>> dataArrayList) {
    this.dataArrayList = dataArrayList;
}

}

Then it should be as simple as:

    MyAdapter myAdapter;
    RecyclerView recyclerView;
    // ...
    // ...

    DefineData defineData = null;
    try {
        // Don't forget to pass in the jsonObject you want!!
        defineData = new DefineData();
    } catch (Exception e) {
        Log.e("TAG", "MyAdapter: ", e.getLocalizedMessage());
    }

    mAdapter = new MyAdapter(defineData.getDataArrayList());
    recyclerView.setAdapter(mAdapter);
0

First get the datalist from the MainData JSON object by converting the JSON to POJO Class object. Then for each Data string in the datalist, split the Data string and store/copy each split value to respective variables (i.e. Sl. No., InNo., etc.).

For splitting the string into an array, use split function of Strings.

String data = "1. ´19110 / Textiles´003220´01-sep-2019´70,605.00´0.00´530.25´982.75´118.00´"; 
String[] dataArray = str.split("´", 0); 

I would suggest you create a class named DataClass ( or some other name that suits it) and add all headers as data members. Once you have the dataArray, create a new DataClass object and add it to the recycler view list.

Sonu Sourav
  • 2,926
  • 2
  • 12
  • 25