【问题标题】:How to make a custom list adapter with textbox and imageview from web?如何使用来自网络的文本框和图像视图制作自定义列表适配器?
【发布时间】:2012-11-16 14:37:55
【问题描述】:

每当用户在 TextBox 中提供一些信息并点击 Button 以启动任务时,我正在使用通过 AsyncTask 运行的参数化 Uri 链接来获取(GET)一些信息。

我得到响应并将该信息作为 JSONObject 插入,并将其放入 HashMap 的 ArrayList 中,该 ArrayList 包含三个字段,全名、用户名和 PhotoByte。

我想要的是为 ListView 制作一个自定义适配器以显示该信息。我知道如何将 decodeByteArray 解码为 Bitmap 并将其设置为 ImageView,但在某个地方我正在苦苦挣扎。

我遵循了这个tutorial 来了解如何制作一个好的自定义适配器...但是我不需要实例化 HttpConnections 也不需要从 url 加载图像,而是需要转换从 url 给出的 byteArray并将其显示在该自定义适配器的 ListView 项内的 ImageView 中。

【问题讨论】:

    标签: android listview hashmap android-imageview listadapter


    【解决方案1】:

    您需要构建一个 .xml 文件,例如 row.xml,您可以在其中设置您喜欢的 TextViews 和 ImageViews(和 Buttons)。

    您还需要构建自定义适配器,就像此处的链接所示:

    http://www.ezzylearning.com/tutorial.aspx?tid=1763429

    我发现这是最好和最简单的自定义列表适配器教程之一。

    另外,值得一提的是,建议进行一些优化,因为列表视图很可能会很慢,并且在功能较弱的设备上不灵活。

    【讨论】:

    • 已经创建了自定义列表视图 XML 布局,因此我可以对其进行扩展,是的,您在优化方面是对的。我正在检查您提供的链接,并尽快就您的回答提供反馈。
    • 该教程在我运行和扫描时非常复杂,但没有给我答案,因为我在解析该适配器中的 ByteArray 然后通过解码为 Bitmap 来处理它而不是将 ImageView setBitmap 设置为新创建的位图图像。
    【解决方案2】:

    是的,使用自定义适配器,您可以在其中做任何您喜欢的事情;)这里有一些代码,但您也许应该查看其他示例以了解适配器的工作原理。

    >      public class Adapter_Custom extends BaseAdapter {
    >         
    >           // DEBUG
    >           private final String TAG = this.getClass().getSimpleName();
    >         
    >           // Layout
    >           private LayoutInflater inflater = null;
    >           public ViewHolder holder;
    >           View vi;
    >         
    >           Context context;
    >           private ArrayList<Item_Pin> pinItems;
    >         
    >           public Adapter_Custom(Context context, ArrayList<Item_Pin> pinItems) {
    >               this.context    = context;
    >               this.pinItems   = pinItems;
    >               
    >               inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    >           }
    >         
    >           // Used internally by this class
    >           public int getCount() {
    >               return pinItems.size();
    >           }
    >           
    >           // 
    >           @Override
    >           public long getItemId(int position) {
    >               // Return whatever u like here
    >               return 0;
    >           }
    >         
    >           @Override
    >           public String getItem(int position) {
    >               return "You can return whatever u like here";
    >           }
    >         
    >           public View getView(int position, View convertView, ViewGroup parent) {
    >         
    >               vi = convertView;
    >          // If there is no ViewHolder already, create a new one
    >               if(convertView  ==  null){
    >                   vi = inflater.inflate(R.layout.your_xml_file, null);
    >                   holder = new ViewHolder();
    >         
    >                   holder.title        = (TextView)vi.findViewById(R.id.your_xml_file_textview);
    >                   holder.background   = (LinearLayout)vi.findViewById(R.id.your_xml_file_linearlayout);
    >         
    >                   vi.setTag(holder);
    >                   holder = (ViewHolder)vi.getTag(); // If there already is a viewholder, reuse it!                 
    } else {
    >                   holder = (ViewHolder)vi.getTag();
    >               }
    >          // This is where you place code for every list item - this is where you convert your base64 to images.
    >               holder.title.setText(pinItems.get(position).getPinText());
    >               // here you could also set the background of holder.background to your base64 image.
    >         
    >               return vi;
    >           }
    >         
    >           //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    >           // VIEWHOLDER - This is the code part of your XML
    >           //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    >           public class ViewHolder{
    >         
    >               public TextView title;
    >               public LinearLayout background;
    >         
    >           }
    >         }
    

    使用该代码并将其替换为您自己的 XML 文件和数据,然后只需将代码放入将字节数组转换为每个列表项的图像的 getView() 方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2011-07-15
      • 2011-12-31
      相关资源
      最近更新 更多