Android Studio:动态添加图标到列表视图



试图自学如何做这些事情。我正在尝试弄清楚如何将图像动态添加到 ListView 项。我正在做的是提取返回以下内容的 JSON 数据:

{"mdslist":
    [
        {
            "UID":"3",
            "name":"Stamford, CT",
            "date":"March 10, 2018",
            "icon":"badge_stamford"
        },
        {
            "UID":"4",
            "name":"Enschede, The Netherlands",
            "date":"March 11, 2018",
            "icon":"badge_enschede"
        }
    ]
}

然后处理该数据并将其转储到 ListView 中。ListView 具有单独的容器来保存数据 - 请注意 ImageView 标记中的临时 img:

md_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/md_item_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:minHeight="65dp">
    <ImageView
        android:id="@+id/md_icon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginBottom="4dp"
        android:layout_marginTop="4dp"
        android:contentDescription="@string/md_logo"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/badge_stamford" />
    <TextView
        android:id="@+id/md_name"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="4dp"
        android:paddingBottom="2dip"
        android:paddingTop="6dip"
        android:textColor="@android:color/black"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/md_icon"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/md_date"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_marginBottom="4dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:paddingBottom="2dip"
        android:textColor="@color/dark_gray"
        android:textSize="14sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/md_icon"
        app:layout_constraintTop_toBottomOf="@+id/md_name" />
</android.support.constraint.ConstraintLayout>

JSON 数据在处理后的 onPostExecute(( 调用期间注入:

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (pd.isShowing()) {
            pd.dismiss();
        }
        /**
         * Dump parsed JSON data into ListView
         **/
        ListAdapter adapter = new SimpleAdapter(
                md_list_all.this, mdList,
                R.layout.md_list_item, new String[]{"name", "date"}, new int[]{R.id.md_name, R.id.md_date});
        lv.setAdapter(adapter);
    }

如您所见,我没有添加图标数据的功能。这些文件被命名为 JSON 数据,扩展名为.jpg。我想要的是获取JSON"图标"信息,并将其注入ImageView。

正如Rizwan在评论中所说,您可能希望使用URL从服务器加载图像。

要回答问题的另一部分,您需要创建自定义ListAdapter,SimpleAdapter不会给您太大的灵活性。

下面我拿了一些我过去做过的代码,并试图让它足够容易理解,如果你对它有任何疑问,请告诉我?

class AdvancedAdapter extends BaseAdapter {
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    private ArrayList<CustomData> mItems;
    AdvancedAdapter(Context context, ArrayList<CustomData> items) {
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mContext = context;
        mItems = items;
    }
    @Override
    public int getCount() {
        return mItems.size();
    }
    @Override
    public Object getItem(int i) {
        return mItems.get(i);
    }
    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            convertView = layoutInflater.inflate(R.layout.layout_for_list_item, null);
        }
        TextView titleView = (TextView) convertView.findViewById(R.id.title);
        final ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
        titleView.setText(mItems.get(position).name());
        imageView.setImageResource(0); //Nulls out the image while loading
......
...... Load image from URL
imageView.setImageBitmap((Bitmap) finalImage);
.....


        return convertView;
    }
}

最新更新