Получить JSONObject из JSONArray и отобразить в виде списка - Модификация - PullRequest
0 голосов
/ 13 октября 2018

Я хочу отобразить JSONObject в виде списка.

private void showStudentInfo(final List<StudentDetails> studentDetails) {

    String userNameValue = getIntent().getStringExtra("name");

    if(studentDetails != null) {
        final ArrayList<Map<String, Object>> itemDataList = new ArrayList<>();

        int size = studentDetails.size();

        for(int i=0; i<size; i++)
        {
            StudentDetails student = studentDetails.get(i);

            Map<String, Object> listItemMap = new HashMap<>();
            listItemMap.put("id", student.getId());
            listItemMap.put("name", student.getId());
            listItemMap.put("email", student.getId());
            listItemMap.put("phone", student.getId());
            listItemMap.put("addresS", student.getId());

            itemDataList.add(listItemMap);
        }

        SimpleAdapter simpleAdapter = new SimpleAdapter(this, itemDataList, R.layout.list_row,
                new String[]{"id", "name","email","phone","addresS"}, 
                new int[]{R.id.id_textview, 
                        R.id.name_textview,
                        R.id.email_textview,
                        R.id.phone_textview,
                        R.id.address_textview
                });
    }
}

JSON

[{
    "id": "1",
    "name": "Ramesh",
    "email": "Ramesh@gmail.com",
    "phone": "123456789",
    "addresS": "blah blah blah"
},

{
    "id": "2",
    "name": "Mahesh",
    "email": "Mahesh@gmail.com",
    "phone": "123456789",
    "addresS": "blah blah blah"
},

....
]

OnClickListener

studentListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(final AdapterView<?> parent, View view, int position, long id) {

                    selectedItem = studentDetails.get(position).getName();

                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);

                    alertDialogBuilder.setPositiveButton("View", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, selectedItem, Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
                            intent.putExtra("name", selectedItem);
                            startActivity(intent);
                        }
                    });

Я хочу, чтобы пользователь нажимал нанапример - mahesh в предыдущем упражнении, тогда я хочу получить информацию об этом имени из файла json - id, name, email, ... и отобразить его в виде списка.

StudentManagerInterface

 @GET("rnr0k")
public Call<List<StudentDetails>> getUserByName(
        @Query("name") String studentNameValue
);

StudentDetails

Getter and Setter methods.

StudentManager

private static String BASEURL = "https://api.myjson.com/bins/";

public static StudentManagerInterface getStudentManagerService(Converter.Factory converterFactory) {

    Retrofit.Builder retrofitBuilder = new Retrofit.Builder();

    retrofitBuilder.baseUrl(BASEURL);

    if(converterFactory!=null) {
        retrofitBuilder.addConverterFactory(converterFactory);
    }

    Retrofit retrofit = retrofitBuilder.build();

    StudentManagerInterface studentManagerInterface = retrofit.create(StudentManagerInterface.class);
    return studentManagerInterface;

Я использую модификацию, и я новичокв этом.Спасибо @TaQuangTu за ответ, но я запутался, потому что я не использую JSONArray.Какие изменения я должен сделать в своем коде?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Предположим, у вас была строка Json.Пример

 String mJson = "[{
    "id": "1",
    "name": "Ramesh",
    "email": "Ramesh@gmail.com",
    "phone": "123456789",
    "addresS": "blah blah blah" },
 {
    "id": "2",
    "name": "Mahesh",
    "email": "Mahesh@gmail.com",
    "phone": "123456789",
    "addresS": "blah blah blah" },
 .... ]"

Затем создайте список массивов для хранения StudentDetails объектов из строки Json:

 ArrayList<User> getArrayList(String mJson)
  {
       ArrayList<User> studentArrayList= new ArrayList<>();
       try
       {
           JSONArray jsonArray = new JSONArray(mJson);
           for(int i=0;i<jsonArray.length();i++)
           {
               JSONObject student= (JSONObject) jsonArray.getJSONObject(i);
               StudentDetails studentId= student.getInt("id");
               String studentName= student.getString("name");
               //get more fields if you want
               studentArrayList.add(new StudentDetails(userId,name,/*parameter*/));//assuming class StudentDetails have the constructor
           }
       } catch (JSONException e) {
           e.printStackTrace();
       }
       return studentArrayList;
 }

После этого создайте простой макет для каждого элемента списка в виде, который ему нравитсячто: Файл layout_studen_item.xml

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        android:orientation="vertical"
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
         <TextView
             android:id="@+id/tv_name"
             android:text="Name"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:textSize="25sp"
             android:textColor="#161616"/>
        <TextView
            android:id="@+id/tv_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#000000" />
    </LinearLayout>

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

public class StudentAdapter extends BaseAdapter {
    private Context mContext;
    private int mIdResourceLayout;
    private List<StudentDetails> StudentList;

    public StudentAdapter(Context mContext, int mIdResourceLayout, List<StudentDetails> StudentList)
    {
        this.mContext = mContext;
        this.mIdResourceLayout = mIdResourceLayout;
        this.studentList= studentList;
    }
    @Override
    public int getCount() {
        return studentList.size();
    }

    @Override
    public Object getItem(int i) {
        return studentList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return studentList.get(i).getmId(); //getmID is a method of StudentDetails class
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup)
    {
        ViewHolder viewHolder = null;
        if(view==null)
        {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(mIdResourceLayout,null);
            viewHolder = new ViewHolder();
            viewHolder.mTextViewName = view.findViewById(R.id.tv_name);
            viewHolder.mTextViewId   = view.findViewById(R.id.tv_id);
            view.setTag(viewHolder);
        }
        else
        {
                viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.mTextViewId.setText("Id: "+studentList.get(i).getmId());
        viewHolder.mTextViewName.setText("Name: "+studentList.get(i).getmName());//getmName is a method of class StudentDetails
        return view;
    }
    private class ViewHolder
    {
        TextView mTextViewName,mTextViewId;
    }
}

Затем в mainActivity, если у вас есть представление списка, давайтеустановите для него адаптер.

ArrayList<StudentDetails> studentList = getArrayList(mJson); //mJson is the json file that i have mentioned above
StudentAdapter adapter= new StudentAdapter(MainActivity.this,R.layout.layout_student_item,studentList);
mListViewUser.setAdapter(adapter);

Теперь у вас есть вся информация о студентах в ArrayList studentList, с вами все станет проще.

0 голосов
/ 13 октября 2018

Ваш код почти верен, за исключением приведенной ниже части.

Map<String,Object> listItemMap = new HashMap<>();
listItemMap.get(student.getId());    // here is the problem
listItemMap.get(student.getName());  // here is the problem
itemDataList.add(listItemMap);

Вы получаете значения (идентификатор и имя) из пустого (или вновь созданного) HashMap вместо добавления данных в него.Простые изменения, подобные приведенным ниже, могут решить вашу проблему (поскольку я сам не тестировал код).

Map<String, Object> listItemMap = new HashMap<>();
listItemMap.put("id", student.getId());     // use put() with key "id"
listItemMap.put("name", student.getName()); // use put() with key "name"
itemDataList.add(listItemMap);

Если указанное выше решение не решает проблему, я бы предложил вам отладить код и убедиться, чточто studentDetails (ArrayList) не пустой.Это означает, что ваш API возвращает правильные данные.

Редактировать

Для отображения только имени просто внесите следующие изменения.

SimpleAdapter simpleAdapter = new SimpleAdapter(this, itemDataList,R.layout.list_row,
            new String[]{"name"}, new int[]{R.id.name_textview});

Удалить идентификаторзначения из Адаптера (передают только имена).А также удалите id_textview TextView из XML-макета.Вот и все!

Удачи!

...