0

Я пытаюсь создать свой собственный arrayAdapter, чтобы я мог разместить несколько текстовых просмотров внутри списка. Я искал везде и не могу найти способ сделать это. Я новичок в этом и не очень уверен, как с этим справиться. Пока у меня есть asynctask, которая собирает 3 строки в методе JSON. Эти строки - это то, что я хочу разместить в textViews, но я понятия не имею, как это сделать, вот мой текущий код.Как создать свой собственный arrayAdapter для listView - Android

class loadComments extends AsyncTask<JSONObject, String, JSONObject> { 
      private ArrayAdapter<String> mAdapter = null; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 


      } 

      @Override 
      protected void onProgressUpdate(String... values) { 
       super.onProgressUpdate(values); 

      } 

      protected JSONObject doInBackground(JSONObject... params) { 


       JSONObject json2 = CollectComments.collectComments(usernameforcomments, offsetNumber); 


        return json2; 



      } 

      @Override 
      protected void onPostExecute(JSONObject json2) { 
       try { 
        if (json2.getString(KEY_SUCCESS) != null) { 
         registerErrorMsg.setText(""); 
         String res2 = json2.getString(KEY_SUCCESS); 
         if(Integer.parseInt(res2) == 1){ 


          JSONArray commentArray = json2.getJSONArray(KEY_COMMENT); 
          final String comments[] = new String[commentArray.length()]; 
          for (int i=0; i<commentArray.length(); i++) { 
           comments[i] = commentArray.getString(i); 
          } 
          JSONArray numberArray = json2.getJSONArray(KEY_NUMBER); 
          String numbers[] = new String[numberArray.length()]; 
          for (int i=0; i<numberArray.length(); i++) { 
           numbers[i] = numberArray.getString(i); 
          } 
          JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME); 
          String usernames[] = new String[usernameArray.length()]; 
          for (int i=0; i<usernameArray.length(); i++) { 
           usernames[i] = usernameArray.getString(i); 
          } 

          ArrayList<String> myList = new ArrayList<String>(); 

          class MyClassAdapter extends ArrayAdapter<String> { 

           private Context context; 

           public MyClassAdapter(Context context, int textViewResourceId, ArrayList<String> items) { 
            super(context, textViewResourceId, items); 
            this.context = context; 
           } 

           public View getView(int position, View convertView) { 
            View view = convertView; 
            if (view == null) { 
             LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
             view = inflater.inflate(R.layout.list_item, null); 
            } 

            String item = getItem(position); 
            if (item!= null) { 
             // My layout has only one TextView 
             TextView commentView = (TextView) view.findViewById(R.id.listComment); 
             TextView usernameView = (TextView) view.findViewById(R.id.listPostedBy); 
             TextView NumberView = (TextView) view.findViewById(R.id.listNumber); 

              // do whatever you want with your string and long 
              commentView.setText(comments); 
              NumberView.setText(numbers); 
              usernameView.setText(usernames); 

            } 

            return view; 
           } 
          } 



          }//end if key is == 1 
         else{ 
          // Error in registration 
          registerErrorMsg.setText(json2.getString(KEY_ERROR_MSG)); 
         }//end else 
        }//end if 
       } //end try 

       catch (JSONException e) { 
        e.printStackTrace(); 
       }//end catch  
      } 
     } 


     new loadComments().execute(); 

Этот код не работает, но я думаю, что нахожусь на правильном пути.

+0

Вы должны использовать BaseAdapter вместо с ArrayAdapter. Вы сможете передать реальный объект, например List, HashMap или что-нибудь еще. –

+0

Можете ли вы указать мне в правильном направлении? –

+0

Я создал ответ, чтобы показать код. –

ответ

0

Допустим, вы создаете класс, которые держат информацию о комментариях вместо создания трех взаимосвязанных массивов:

class Commentary 
{ 
    public String username; 
    public String comment; 
    public int commentaryIndex; 
} 

BaseAdapter может взять список в качестве параметра, тогда как ArrayAdapter не будет.

class MyRealAdapter extends BaseAdapter 
{ 
    private List<Commentary> comments; 

    public MyRealAdapter(List<Commentary> comments) 
    { 
     this.comments = comments; 
    } 

    @Override 
    public int getCount() { 
     return comments.size(); 
    } 

    @Override 
    public Object getItem(int index) { 
     return comments.get(index); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Commentary c = (Commentary) getItem(position); 
     //c.username, c.comment, c.commentaryIndex 

     // create the view and stuff 
     return null; 
    } 
} 

Как вы можете видеть, вы опять метод GetView, но теперь вы можете восстановить свой полный Objet, а не просто строка. Существует еще несколько способов переопределить, но, как вы видите, это очень просто.

Возможно, вам понадобится передать другой конструктор, например Контекст или LayoutInflater, но это не обязательно.

РЕДАКТИРОВАТЬ:

JSONArray commentArray = json2.getJSONArray(KEY_COMMENT); 
    JSONArray numberArray = json2.getJSONArray(KEY_NUMBER); 
    JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME); 
    ArrayList<Commentary> comments = new ArrayList<commentary>(); 
    for (int i=0; i<commentArray.length(); i++) { 
     Commentary c = new Commentary(); 
     c.username = usernameArray.getString(i); 
     c.comment = commentArray.getString(i); 
     c.commentaryIndex = Integer.parseInt(numberArray.getString(i)); 
     comments.add(c); 
    } 

    MyRealAdapter adapter = new MyRealAdapter(comments); 
+0

Это не очень помогает, как я могу поместить строки в комментарии к классу, когда строки создаются с помощью json? –

+0

Я обновил свой ответ. –

Смежные вопросы