Android - 如何使用适配器类中的代码在布局文件中设置图像?

Posted

技术标签:

【中文标题】Android - 如何使用适配器类中的代码在布局文件中设置图像?【英文标题】:Android - How can I set an Image in a layout file with code from an adapter class? 【发布时间】:2015-02-12 07:24:46 【问题描述】:

我正在开发一个遵循此 youtube 链接上的教程的 android 项目: https://www.youtube.com/watch?v=YCHNAi9kJI4 . 这是一个动画 listView 删除。

我在 opaque_text_view.xml 文件的一部分中有一个图像设置:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image_text_vew_list"
    android:layout_
    android:layout_
    android:background="@drawable/tv_background_with_divider"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:drawableLeft="@drawable/ic_launcher"   <--------------------------
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

这很完美,但是,我想动态更改图像,以便使用类似 gmail 的图标进行调整,这些图标反映了邮件本身的字母和颜色。我已经有了将图像设置为看起来像我在这里获得的 Gmail 客户端的代码:Colored boxed with letters a la Gmail。

我遇到的问题是调整 opaque_text_view.xml 的代码只能在适配器中找到:

public class ListViewRemovalAnimation extends Activity 

    StableArrayAdapter mAdapter;

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view_deletion);

        mBackgroundContainer = (BackgroundContainer) findViewById(R.id.listViewBackground);

        //Set the adapter here
        --> mAdapter = new StableArrayAdapter(this,R.layout.opaque_text_view, list, mTouchListener);** <--
        mListView.setAdapter(mAdapter);

StableArrayAdapter 是它自己的类,定义如下:

public class StableArrayAdapter extends ArrayAdapter<String> 
...

我基本上必须从那个 StableArrayAdapter 中编辑图片,但由于它没有扩展到活动,所以我找不到方法来做到这一点。我尝试使用此How to programmatically set drawableLeft on Android button? 链接中的代码,但同样的问题。

换一种说法,如何更改 opaque_text_view (drawableleft) 中的图像以将其更新为:

final LetterTileProvider tileProvider = new LetterTileProvider(this);
final Bitmap letterTile = tileProvider.getLetterTile("name", "key", tileSize, tileSize);
//SET BITMAP IMAGE HERE!!!

没有活动的好处。 有人有什么建议吗?

【问题讨论】:

我不清楚具体问题是什么。您是在问如何在 Adapter 中实例化 LetterTileProvider 吗?或者如何在 TextView 上设置 Drawable?还是别的什么? 向迈克道歉!基本上,我如何在文本视图中设置可绘制对象。我能够实例化 LetterTileProvider,我只是不知道如何将它传递给文本视图上的绘图。 【参考方案1】:

我不确定我是否理解,因为提供的代码不多。完整的 Activity 代码、ArrayAdapter 代码和项目类别的代码会有所帮助。

在活动 onCreate 你想要这样的东西:

    yourListView.setAdapter(yourAdapter);
    yourListView.setOnItemClickListener(new OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int pos, long id) 
            YourItemClass itemClicked = view.yourGetData();
            yourAdapter.changeIcon(itemClicked);
        
    );

在 ArrayAdapter 中你想创建一个函数,比如:

public void changeIcon(YourItemClass item) 
    YourItemClass.setClicked(true);
    notifyDataSetChanged();

还在你的 ArrayAdapter 中的 getView(int position, View convertView, ViewGroup parent) 中添加:

if (yourArray.get(position).isClicked()) 
    yourTextView.setCompoundDrawables(getContext().getResources().getDrawable( R.drawable.your_clicked_icon), null, null, null);

然后,在您的项目类中,您需要某种方式来存储它是什么类型。例如,在这里编码,您需要一个带有 setClicked() 和 isClicked() 方法的 isClicked 布尔值。

【讨论】:

这正是我找到正确答案所需要的,感谢您花时间回答!

以上是关于Android - 如何使用适配器类中的代码在布局文件中设置图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中单击listview适配器时展开和折叠视图

如何在按钮单击时获得适配器类中的点击列表项位置

如何使用lambda表达式/缩短onclicklisteners android studio

如何在 recyclerview 适配器中将动态视图添加到 android 布局

如何在 android 中实用地添加和删除布局?

如何在适配器类中的列表视图项上获取动画?