установить ImageView src через ListAdapter - PullRequest
2 голосов
/ 03 марта 2011

Привет, у меня есть один вопрос ..

Я пытаюсь написать приложение для Android с Java.

У меня есть hashmaplist (1), сохраненный в списке (2). чтобы показать список (2) записей (тех, кто сохранил в hashmap (1)), я использую объект ListAdapter.

все работает нормально, кроме следующих: одна из записей, сохраненных в hashmaplist (1), это "страна", например, "at", "de", "gb", ... Теперь я хочу изменить источник фотографий, созданный на макете, в зависимости от страны.

вот какой-то код ..

сохранить записи и показать их с объектом ListAdapter:

for (int i = 0; i < itemArray.length(); ++i) {
JSONObject rec = itemArray.getJSONObject(i);

//save entrys in hashmap
map = new HashMap<String, String>();
map.put("name", rec.getString("name"));
map.put("country", rec.getString("country"));


//save hashmap entry in list
mylist.add(map);
}

ListAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.listitem,
                new String[] {"name"}, new int[] {R.id.area});

listview.setAdapter(mSchedule);

Теперь XML-формат:

<LinearLayout 
    android:id="@+id/linearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView 
        android:id="@+id/imageView10" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/be">
    </ImageView>

    <TextView 
        android:id="@+id/area" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </TextView>

</LinearLayout>

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

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

class CustomViewBinder extends SimplerAdapter.ViewBinder
{
            @Override
    public boolean setViewValue(View view, Object data,
            String textRepresentation) {
        int id=view.getId();
            String country=(String)data; 
                switch(id)
                {
                  case R.id.country:
                            if(country.equals("us")
                                setYourImage();
                   .....

            }
        }
}

, и в своей деятельности используйте свой простой адаптер как

        SimplerAdapter sa=new SimpleAdapter(this, mylist, R.layout.listitem,
                new String[] {"name","country"}, new int[] {R.id.area,r.id.country});
        sa.setViewBinder(new CustomViewBinder());

Надеюсь, это поможет вам

2 голосов
/ 21 апреля 2012

Итак, я заставил это работать так.

Это простой адаптер:

SimpleAdapter sa = new SimpleAdapter(ctx, activityList, R.layout.activity_list_item, new String[] { TAG_TITLE,
                TAG_LAT, TAG_DATE, TAG_IMAGE_DATA }, new int[] { R.id.activity_title, R.id.location_title,
                R.id.date_title, R.id.activity_picture });
        sa.setViewBinder(new CustomViewBinder());
        setListAdapter(sa);

Это переплет:

class CustomViewBinder implements SimpleAdapter.ViewBinder {
    public boolean setViewValue(View view, Object inputData, String textRepresentation) {
        int id = view.getId();
        String data = (String) inputData;
        switch (id) {
        case R.id.activity_picture:
            populateImage(view, data);
            break;

        case R.id.location_title:
            populateLocation(view, data);
            break;

        case R.id.date_title:
            populateDate(view, data);
            break;

        }
        return true;

    }
}

И вот методы, которые я назвал:

public void populateImage(View view, String imageData) {
    try {

        Log.i("JSON Image Data", "string " + imageData);
        byte[] imageAsBytes = null;
        try {
            imageAsBytes = Base64.decode(imageData.getBytes());
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        ImageView image = (ImageView) view.findViewById(R.id.activity_picture);
        image.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));
        Drawable d = new BitmapDrawable(getResources(), BitmapFactory.decodeByteArray(imageAsBytes, 0,
                imageAsBytes.length));

        image.setBackgroundDrawable(d);

        Drawable tappedPicture = getResources().getDrawable(R.drawable.tapped_picture);
        Bitmap tappedPictureBitmap = ((BitmapDrawable) (tappedPicture)).getBitmap();
        image.setImageBitmap(tappedPictureBitmap);
    } catch (Exception e) {

    }
}

public void populateLocation(View view, String data) {
    TextView locationTxt = (TextView) view.findViewById(R.id.location_title);
    locationTxt.setText(data);
}

public void populateDate(View view, String data) {
    TextView dateTxt = (TextView) view.findViewById(R.id.date_title);
    dateTxt.setText(data);
}
0 голосов
/ 03 марта 2011

вы реализуете SimpleAdapter по умолчанию, вы должны настроить этот адаптер, переопределив

Метод getView () и установка src изображения. например,

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

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.newsrow, null);
        }
        Item item = itemsList.get(position);
        if (item != null) {
            TextView nt = (TextView) convertView.findViewById(R.id.NewsTitle);
            ImageView nth = (ImageView) convertView.findViewById(R.id.NewsThumbnail);
            nt.setText("abc");
                        loadImage(item.getThumbnail(), nth);
        }
        return convertView;
    }
0 голосов
/ 03 марта 2011

Захватите ImageView и используйте setImageDrawable или setImageResource?

ImageView mImageView = (ImageView) getViewById(R.id.imageView10);
mImageView.setImageResource(R.drawable.gb);

И используйте какой-нибудь корпус переключателя, чтобы выбрать правильный чертеж?Пример переключения (вы бы поместили вызов setImageResource внутри переключателей для рассматриваемых стран):

    switch (item.getItemId()) {
    case R.id.about:
        displayAbout();
        return true;
    case R.id.help:
        displayHelp();
        return true;
...