简体   繁体   English

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

[英]How to change imageview source from another class?

I have 2 classes, the first is FragmentA and the second is ListRequestAdapter (ArrayAdapter). 我有2个类,第一个是FragmentA ,第二个是ListRequestAdapter (ArrayAdapter)。 I wanted to change an ImageView in ListRequestAdapter from my FragmentA . 我想从FragmentA更改ListRequestAdapterImageView But I always get an error NullPointerException when I declare the ImageView in my FragmentA . 但是,当我在FragmentA声明ImageView时,总是会收到NullPointerException错误。 How could I do that? 我该怎么办?

Here is my code: 这是我的代码:

FragmentA.java class: 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 class: 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;
}
}

List item's layout: 列表项的布局:

<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>

You answer does not help you to upate the ImageView in the ListView. 您的回答不能帮助您更新ListView中的ImageView。 You just make a new View (anotherView) which is not related to anything. 您只需创建一个与任何内容都不相关的新视图(anotherView)。 To update your ImageView in the ListView, you should have some related info (ImageID or ImagePath etc) in your DataList. 要在ListView中更新ImageView,您的DataList中应该有一些相关信息(ImageID或ImagePath等)。 After the info is set/updated, just call adapter.notifyDataSetChanged() inside your Fragment. 设置/更新信息后,只需在Fragment中调用adapter.notifyDataSetChanged()。

In addition, you may modify your ListRequestAdapter to hide the ImageView if no data, like this: 另外,如果没有数据,您可以修改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;
    }
}

Hope this help! 希望有帮助!

Problem solved by just inflating the layout that contains the ImageView like this: 仅通过扩大包含ImageView的布局即可解决问题,如下所示:

View anotherView =     inflater.inflate(R.layout.style_fragment_list_request,container,false);
imgView = (ImageView)anotherView.findViewById(R.id.listPhoto);`

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM