Отображение данных в Recyclerview из одной строки JSONobject с несколькими значениями - PullRequest
4 голосов
/ 04 мая 2020

У меня есть DataList jsonarray с jsonobject как Data, строка имеет разные значения, которые разделены символом «´», значения соответственно соответствуют объекту «Заголовки», мне нужно отобразить это в представление переработчика как SL., InNo, и т. д. c., как я могу добиться этого, разделив символ "´", который дает массив строк, я также должен отображать эти данные из адаптера в другое текстовое представление, любые идеи будут действительно полезно.

   "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
           },

Ответы [ 3 ]

1 голос
/ 04 мая 2020

У вас есть несколько подходов, чтобы выполнить эту задачу,

сначала извлеките необходимую информацию в строку, затем вы можете использовать функцию

replace, чтобы заменить '' 'на' 'read Подробнее об обработке строк в java

извлечение: Преобразование JSON данных в Java объект

замена функции: Как удалить специальные символы из строка?

0 голосов
/ 12 мая 2020

Предполагая, что вы хотите, чтобы ваши данные были в удобной для использования структуре, подобной этой.

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

 ]

Как уже упоминали другие, идея заключается в использовании split("´"), остальное - это то, как вы хотите структурировать свои данные.

Используйте класс или метод для создания вышеуказанной структуры:

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;
}
}

Ваш адаптер для RecyclerView должен выглядеть примерно так:

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;
}

}

Тогда он должен будь таким простым:

    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 голосов
/ 11 мая 2020

Сначала получите список данных из объекта MainData JSON, преобразовав JSON в объект класса POJO. Затем для каждой строки Data в списке данных разбейте строку Data и сохраните / скопируйте каждое значение разделения в соответствующие переменные (т. Е. Номер сл., InNo. И т. Д. c.).

Для разбиения строки на массив используйте функцию split 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); 

Я бы предложил создать класс с именем DataClass (или другое подходящее имя) и добавить все заголовки в качестве членов данных. Получив dataArray, создайте новый объект DataClass и добавьте его в список просмотра переработчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...