2016-07-08 3 views
0

Я создал пользовательский класс адаптера и класс getter и setter под названием Bean. Это делается для представления списка, в котором есть textView и изображение.Как заполнить собственный список двумя массивами.

Как я могу заполнить myList так, чтобы он был полезен, когда я устанавливаю адаптер и, таким образом, отображает соответствующий текст и изображение из моих массивов в свой списокView?

Я представил код для моего адаптера и класса bean, а также мою задачу Async класса Activity Activity, но проблема заключается в моем методе onPostExecute из моего класса Async.

Просто уточнить. Этот код НЕ был протестирован и поэтому не возвратил никаких ошибок. Мой вопрос заключается в том, как заполнить myList в методе onPostExecute информацией из массивов String «descriptionArray» и «photoArray».

Мой Основная деятельность Класс Асинхронный Задача

private class MyTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 

     String content = HttpManager.getData(params[0]); 
     return content; 
    } 




//-----------------------THIS IS WHERE THE ISSUE IS HAPPENING--------------------------- 
    @Override 
    protected void onPostExecute(String result) { 
     hideDialog(); 
     String parseResult = InfoJSONResultParser.parseFeed(result); 

     importerArray = OrderInformationParser.orderParser(result); 

     if (parseResult.equals("ok")) { 
      //Returns the Array with the JSON info already parsed. 
      List<Bean> myList = new ArrayList<>(); //<---***How to populate this*** 




//***With the information from these two String arrays.*** 
      String[] descriptionArray = OrderInformationParser.orderParser(result); 
      String[] photoArray = PhotoParser.photoParser(result); 


      //This creates and executes the list 
      list = (ListView)findViewById(R.id.orderListView); 


      //***So i can then transfer over to this adapter*** 
      MyAdapter adapter = new MyAdapter(MainActivity.this, myList); 
      list.setAdapter(adapter); 


     } else { 
      findViewById(R.id.nullOrders).setVisibility(View.VISIBLE); 
     } 
    } 

} 

адаптер класса

public class MyAdapter extends BaseAdapter { 
private Context mContext; 
private List<Bean> mList; 

public MyAdapter(Context context,List<Bean> list){ 
    mContext=context; 
    mList=list; 
} 

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

@Override 
public Object getItem(int position) { 
    return mList.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    //use converview recycle 
    if(convertView==null){ 
     holder=new ViewHolder(); 
     convertView = LayoutInflater.from(mContext).inflate(R.layout.content_orders, parent, false); 
     holder.textView= (TextView) convertView.findViewById(R.id.textView2); 
     holder.imageView= (ImageView) convertView.findViewById(R.id.imageView2); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    //set text and url 
    holder.textView.setText(mList.get(position).getText()); 
    Picasso.with(mContext).load(mList.get(position).getUrl()).into(holder.imageView); 

    return convertView; 
} 

class ViewHolder{ 
    TextView textView; 
    ImageView imageView; 

} 
} 

Bean Class

public class Bean { 
String text; 
String url; 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 
} 
+0

чем проблема ? Вызывает ли это исключение? Пожалуйста, будьте более конкретными по вашей проблеме. – rsella

+0

@rsella Это не исключение. Я просто не знаю, как заполнить myList информацией из массивов String. – Kekis2014

ответ

2

Вы можете заполнить ваш список итерируя ваши 2 Массивы и добавить Строки к объектам Bean.

Пример:

private List<Bean> populateBeanList(List<Bean> myList, String[] descArray, String[] photoArray){ 

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

     Bean bean = new Bean(); 
     bean.setText(descArray[i]); 
     bean.setUrl(photoArray[i]); 
     myList.Add(bean); 
    } 

    return myList; 
} 

Затем вызовите функцию в асинхронным класса

private class MyTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 

     String content = HttpManager.getData(params[0]); 
     return content; 
    } 




//-----------------------THIS IS WHERE THE ISSUE IS HAPPENING--------------------------- 
    @Override 
    protected void onPostExecute(String result) { 
     hideDialog(); 
     String parseResult = InfoJSONResultParser.parseFeed(result); 

     importerArray = OrderInformationParser.orderParser(result); 

     if (parseResult.equals("ok")) { 
      //Returns the Array with the JSON info already parsed. 
      List<Bean> myList = new ArrayList<>(); //<---***How to populate this*** 




//***With the information from these two String arrays.*** 
      String[] descriptionArray = OrderInformationParser.orderParser(result); 
      String[] photoArray = PhotoParser.photoParser(result); 

     myList = populateBeanList(myList,descriptionArray, photoArray); 

     //This creates and executes the list 
     list = (ListView)findViewById(R.id.orderListView); 


     //***So i can then transfer over to this adapter*** 
     MyAdapter adapter = new MyAdapter(MainActivity.this, myList); 
     list.setAdapter(adapter); 


    } else { 
     findViewById(R.id.nullOrders).setVisibility(View.VISIBLE); 
    } 
} 

}

Update:

public class MyAdapter extends BaseAdapter { 
private Activity activity; 
private List<Bean> mList; 
private static LayoutInflater inflater; 

public MyAdapter(Activity act,List<Bean> list){ 
    activity=act; 
    mList=list; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public Object getItem(int position) { 
    return mList.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 
    //use converview recycle 
    if(convertView==null){ 
     convertView = inflater.inflate(R.layout.content_orders, null); 
     holder=new ViewHolder(); 
     holder.textView= (TextView) convertView.findViewById(R.id.textView2); 
     holder.imageView= (ImageView) convertView.findViewById(R.id.imageView2); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    //set text and url 
    holder.textView.setText(mList.get(position).getText()); 
    Picasso.with(activity).load(mList.get(position).getUrl()).into(holder.imageView); 

    return convertView; 
} 

class ViewHolder{ 
    TextView textView; 
    ImageView imageView; 

} 
} 
+1

Хотя наилучшим способом заполнить список будет сериализация веб-ответа в списке с использованием: GSON, Jackson. – rlshaw

+0

Это именно то, что я закончил делать, и он работал, используя текстовую часть, так что спасибо! Я предполагаю, что я должен делать что-то неправильно в моем классе адаптера, потому что мое изображение все еще не отображается. Только текст. – Kekis2014

+0

Вы выяснили, что происходит с вашим адаптером? – rlshaw

0

Из того, что я понял из вашего вопроса, вы не знаете, как для заполнения списка.

Ну, это непростая задача. Предположим, что descriptionArray содержит тексты, а photoArray содержит URL-адреса.

Необходимый код является то, что:

Сначала добавить конструктор к Bean класса для удобства:

public Bean(String text, String url) { 
    this.text = text; 
    this.url = url; 
} 

Это просто добавить непустой конструктор, поэтому мы можем инициализировать поля класса напрямую на создание экземпляра.

Во-вторых, позвонить по методу addArrayList. Как это:

myList.add(new Bean(text, url)) 

Очевидно, что вам нужно положить его в цикле (для каждого элемента массивов вставить новый Bean).Так будет выглядеть следующим образом:

for (int i=0; i<descriptionArray.lenght; i++) { 
    myList.add(new Bean(descriptionArray[i], photoArray[i]); 
} 

Это создаст новый Bean для каждой пары в descriptionArray и photoArray.

Таким образом, вам необходимо проверить, имеют ли два массива одинакового размера. для этого необходимо поместить петлю for в если:

if (descriptionArray.lenght == photoArray.lenght) { 
    //execute for loop 
} 
else { 
    //Arrays have different size. Wtf? Manage the error 
} 

Может время сделать небольшое исследование Google по этой теме до размещения;)

Надеется, что это помогает немного

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