java - 如何从另一个类更改 imageview 源?

标签 java android listview android-imageview android-adapter

我有 2 个类,第一个是 FragmentA,第二个是 ListRequestAdapter (ArrayAdapter)。我想从我的 FragmentA 更改 ListRequestAdapter 中的 ImageView。但是当我在 FragmentA 中声明 ImageView 时,我总是收到错误 NullPointerException 。我怎样才能做到这一点?

这是我的代码:

FragmentA.java 类:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_item_list_request, container, false);
    setHasOptionsMenu(true);


    listPhoto = (ImageView) getView().findViewById(R.id.listPhoto);
    listPhoto.setImageResource(R.drawable.pastel_blue);

    }

ListRequestAdapter.java类:

public class ListRequestAdapter extends ArrayAdapter<ListRequestItem> {
ImageView listPhoto;

public ListRequestAdapter(Context context, List<ListRequestItem> items)
{
    super(context, R.layout.style_fragment_list_request, items);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(convertView == null) {
        // inflate the GridView item layout
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.style_fragment_list_request,  parent, false);

        // initialize the view holder
        viewHolder = new ViewHolder();
        viewHolder.tvTanggal = (TextView) convertView.findViewById(R.id.tvTanggalRequest);
        viewHolder.tvTipe = (TextView) convertView.findViewById(R.id.tvTipeRequest);
        viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.tvStatus);
        viewHolder.permitid = "";
        convertView.setTag(viewHolder);
    } else {
        // recycle the already inflated view
        viewHolder = (ViewHolder) convertView.getTag();
    }

    // update the item view
    ListRequestItem item = getItem(position);
    viewHolder.tvTanggal.setText(item.tanggal);
    viewHolder.tvTipe.setText(item.tipe);
    viewHolder.tvStatus.setText(item.status);
    viewHolder.permitid = item.permitid;
    return convertView;
}

private static class ViewHolder {
    TextView tvTanggal;
    TextView tvTipe;
    TextView tvStatus;
    String permitid;
}
}

列表项的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="reqtag"
android:id="@+id/rlListRequestWorkflow"
>
<LinearLayout
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:weightSum="1"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="0.2"
        android:orientation="vertical"
        android:layout_height="wrap_content">

        <!--ImageView here-->
        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/listPhoto"
            android:layout_width="65dp"
            android:layout_height="63dp"
            android:layout_weight="1"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/ic_menu_camera"
            android:layout_marginTop="10dp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="0.8"
        android:orientation="vertical"
        android:layout_height="wrap_content">

        <!--All textViews here-->
        <TextView
            android:layout_width="100dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Type"
            android:textSize="18dp"
            android:fontFamily="sans-serif"
            android:textColor="@color/black"
            android:id="@+id/tvTipeRequest"
            android:width="130dp" />

        <TextView
            android:layout_width="100dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Date"
            android:fontFamily="sans-serif"
            android:id="@+id/tvTanggalRequest"
            android:textSize="15dp"
            android:width="130dp" />

        <TextView
            android:layout_width="100dp"
            android:layout_weight="1"
            android:layout_height="50dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/black"
            android:text="Status"
            android:textSize="15dp"
            android:fontFamily="sans-serif"
            android:id="@+id/tvStatus"
            android:layout_column="38" />
    </LinearLayout>

</LinearLayout>

最佳答案

您的回答不能帮助您更新ListView中的ImageView。您只需创建一个与任何内容无关的新 View (另一个 View )。要更新 ListView 中的 ImageView,您的 DataList 中应该有一些相关信息(ImageID 或 ImagePath 等)。设置/更新信息后,只需在 fragment 内调用adapter.notifyDataSetChanged()即可。

此外,如果没有数据,您可以修改 ListRequestAdapter 以隐藏 ImageView,如下所示:

public class ListRequestAdapter extends ArrayAdapter<ListRequestItem> {

    public ListRequestAdapter(Context context, List<ListRequestItem> items){
        super(context, R.layout.style_fragment_list_request, items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null) {
            // inflate the GridView item layout
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.style_fragment_list_request,  parent, false);
            // initialize the view holder
            viewHolder = new ViewHolder();
            viewHolder.imgPhoto = (ImageView) convertView.findViewById(R.id.listPhoto);
            viewHolder.tvTanggal = (TextView) convertView.findViewById(R.id.tvTanggalRequest);
            viewHolder.tvTipe = (TextView) convertView.findViewById(R.id.tvTipeRequest);
            viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.tvStatus);
            viewHolder.permitid = "";
            convertView.setTag(viewHolder);
        } else {
            // recycle the already inflated view
            viewHolder = (ViewHolder) convertView.getTag();
        }
        // update the item view
        ListRequestItem item = getItem(position);

        // Setup ImageView accord to DataList,
        // may be imageID from DataList.
        if(imageID == null) viewHolder.imgPhoto.setVisibility(View.INVISIBLE);
        else{
             viewHolder.imgPhoto.setImageResource(item.imageID);
             viewHolder.setVisibility(VIEW_VISIBLE);
        }

        viewHolder.tvTanggal.setText(item.tanggal);
        viewHolder.tvTipe.setText(item.tipe);
        viewHolder.tvStatus.setText(item.status);
        viewHolder.permitid = item.permitid;
        return convertView;
    }

    private static class ViewHolder {
        ImageView imgPhoto;
        TextView tvTanggal;
        TextView tvTipe;
        TextView tvStatus;
        String permitid;
    }
}

希望这有帮助!

关于java - 如何从另一个类更改 imageview 源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275146/

相关文章:

java - 按存在于另一个数组列表中的 ListView 排序

android - 如何使用 ListFragment 中的 ListView?

java - 在 ListView android中定位字符串

java - 如何在 Java 类应用程序中添加另存为对话框

java - 使用Gson的JSON格式

java - 简单的Java Web服务问题

java - 创建一个 JButton 数组

android - 编写自己的 Android 应用程序供个人使用?

android - 尝试在 Android 库中使用 Room,但找不到方法 ksp()(Kotlin 符号处理)

从 R.attr 引用返回颜色资源 ID 的 Android 测试方法