2014-10-22 3 views
0

У меня есть список со следующей планировкой:Android динамически устанавливать ImageView в списке

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/outName" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/outSurname" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/outAddress" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/outPhone" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 

     <ImageView 
     android:id="@+id/outPhoto" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Я восстановить свои поля от BD в JSON формате с использованием Async задачи, и я заполняю список в функции onPostExecute как так:

// Updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 

        // Updating parsed JSON data into ListView 
        ListAdapter adapter = new SimpleAdapter(
          MyActivity.this, MyList, 
          R.layout.my_layout, new String[] { “name”, “surname”, “address”, "phone" }, 
          new int[] { R.id.outName, R.id.outSurname, R.id.outAddress, R.id.outPhone }); 
        // Updating ListView 
        setListAdapter(adapter); 
       } 
      }); 

     } 

    } 

где MyList является ArrayList:

ArrayList<HashMap<String, String>> MyList; 
MyList = new ArrayList<HashMap<String, String>>(); 

Каждое поле моих результатов JSONArray является состоящий из «имени», «фамилии», «адреса», «телефона» и «фотографии». «фото» - это числовое поле с 4 возможными значениями (0, 1, 2, 3), где каждое значение относится к определенному изображению, которое у меня есть в моей папке с возможностью рисования. Как я могу установить динамическое изображение ImageView в зависимости от этого значения?

+1

'onPostExecute()' уже выполнен в потоке пользовательского интерфейса. Нет необходимости обертывать код в 'runOnUiThread()'. Имейте в виду, что ваша деятельность может быть остановлена ​​/ уничтожена при вызове 'onPostExecute()'. –

+0

Я думаю, что это было что-то вроде retrieve ImageView по id из R, а затем называть setBackground (drawable) на нем. Drawable является ресурсом, который вы также извлекаете через findById из R. –

+0

@LJoosse У меня есть основной класс, в котором я вызываю (MyClass(). Execute();) другой класс расширяет AsyncTask, состоящий из onPreExecute(), doInBackground (String ... args) и onPostExecute (String file_url). Я всегда считал, что это лучший способ. Могу ли я сделать это по-другому? user3427079 Я потратил много времени на то, чтобы подумать, как сделать это без адаптера, но я никогда не найду решение. – Fedro

ответ

0

Вам необходимо написать адаптер. сделайте свой собственный, основываясь на этом.

public class ListAdapter extends BaseAdapter{ 

     Context context; 
     ArrayList<HashMap<String, String>> myList; 

     public BankAdapter(Context context,ArrayList<HashMap<String, String>> myList){ 
      this.context = context; 
    this.myList=myList; 
     } 

     static class ViewHolder { 
    // Include Number of reqd views. 
      private TextView item; 
      private ImageView pic; 


      } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return items.length; 
     } 

     @Override 
     public Object getItem(int pos) { 
      // TODO Auto-generated method stub 
      return items[pos]; 
     } 

     @Override 
     public long getItemId(int pos) { 
      // TODO Auto-generated method stub 
      String id = items[pos].getId(); 
      return Long.parseLong(id); 
     } 


     @Override 
     public View getView(int position, View view, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      ViewHolder mViewHolder = null; 
      if(view == null){ 
       mViewHolder = new ViewHolder(); 
       LayoutInflater inflater = (LayoutInflater)context.getSystemService 
         (Activity.LAYOUT_INFLATER_SERVICE); 
       view = inflater.inflate(R.layout.listrow,parent,false); 
       mViewHolder.item = (TextView)view.findViewById(R.id.items_txt); 
       mViewHolder.pic=(ImageView)view.findViewById(R.id.pics_img) 
       view.setTag(mViewHolder); 
      } 

      else{ 
       mViewHolder = (ViewHolder)view.getTag(); 
      } 


      mViewHolder.item.setText(myList.get(position).getKey()); 
    if(condition){ 
    //update Image with correct item. 
     mViewHolder.pic.setDrawable(//getitemfromList); 
    } 
      return view; 
     } 

    } 
+0

Спасибо, на данный момент я думаю, что реализация адаптера - единственный способ сделать это. Я пишу свой собственный адаптер, так или иначе я не могу понять, когда я выполняю свое приложение, список пуст. Это мой адаптер: http://pastebin.com/LPf6HRZ2 – Fedro

+0

Не важно. Я нашел свою ошибку. – Fedro