android - RecyclerView适配器布局不显示图标

标签 android imageview android-adapter android-recyclerview

首先,这是一个屏幕截图(抱歉,绘画编辑很差):

enter image description here

您可能已经注意到,只有中间一行有一个图标(绿色圆圈),但是,我正在设置所有行的图标,或者也许我认为我是。 图标可以是绿色或红色,第一行应显示绿色图标,最后一行应显示一个红色图标,但它们都没有显示任何内容,仅显示第二行,所以我的问题是,为什么我的行中只有一行显示图标正确地,当然,我该如何解决它?

这是我的适配器代码:

//imports and stuff     
public class EstablishmentAdapter extends RecyclerView.Adapter<EstablishmentViewHolder> {

    private ArrayList<EstablishmentModel> establishmentList;
    private Context context;
    private boolean hasPermission;
    private int selectedPosition = 0;

    public EstablishmentAdapter(ArrayList<EstablishmentModel> establishmentList, Context context, boolean hasPermission) {
        this.establishmentList = establishmentList;
        this.context = context;
        this.hasPermission = hasPermission;
    }

    @Override
    public EstablishmentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        EstablishmentViewHolder viewHolder;
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_adapter_establishment, parent, false);
        viewHolder = new EstablishmentViewHolder(v, (byte)0, hasPermission);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(EstablishmentViewHolder holder, final int position) {
        final EstablishmentModel item = establishmentList.get(position);

        Log.d(((EstablishmentActivity)context).logTagDebug, "Position: "+ String.valueOf(position));
        Log.d(((EstablishmentActivity)context).logTagDebug, "ViewHolder: "+ String.valueOf(holder.getAdapterPosition()));

        setUpTextFieldsItemRow(holder, item);
        new ImageDonwloaderTask(holder.ivIcon).execute(item.getIconUrl());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                notifyItemChanged(selectedPosition);
                selectedPosition = position;
                notifyItemChanged(selectedPosition);

                //Se a gente botar o full, fazer switch case aqui
                setUpPayContractTypeAction(item);
            }
        });
    }

    private void setUpTextFieldsItemRow(EstablishmentViewHolder holder, EstablishmentModel item) {
        holder.tvClosingTime.setText(item.getClosingTime());
        holder.tvOpeningTime.setText(item.getOpeningTime());
        holder.tvName.setText(item.getName());
        holder.tvType.setText(item.getType());

        if (item.isOpened()) {
            holder.ivWorkingStatus.setImageResource(R.drawable.img_dot_green);
        } else {
            holder.ivWorkingStatus.setImageResource(R.drawable.img_dot_red);
        }
    }

    private void setUpPayContractTypeAction(EstablishmentModel item) {
        if(item.isOpened()) {
            PaymentInfoViewModel p = new PaymentInfoViewModel();
            p.setIdEstablishment(item.getIdEstablishment());
            p.setNameEstablishment(item.getName());

            Intent intent = new Intent(context, CardNumberActivity.class);
            intent.putExtra(ConstantsUtils.PARAM_INTENT_PAYMENT_INFO, p);

            context.startActivity(intent);
        }
        else {
            EstablishmentActivity activity = ((EstablishmentActivity) context);

            String title = String.format(context.getString(R.string.str_msg_error_closed_establishment_title),
                    item.getName());
            String message = String.format(context.getString(R.string.str_msg_error_closed_establishment_msg),
                    item.getName(), item.getOpeningTime(), item.getClosingTime());

            activity.buildAlert(title, message).show();
        }
    }

    @Override
    public int getItemCount() {
        return establishmentList.size();
    }
}

这是 Activity 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/dl_menu"
    android:elevation="7dp"
    tools:context=".view.activity.EstablishmentActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_refresh_establishments"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_establishments"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
        </android.support.v7.widget.RecyclerView>

    </android.support.v4.widget.SwipeRefreshLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_menu_drawer"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:background="#ffffff">

    </android.support.v7.widget.RecyclerView>

</android.support.v4.widget.DrawerLayout>

项目行布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >

    <ImageView
        android:id="@+id/iv_establishment_icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="@dimen/margin_horizontal_small"
        android:layout_marginLeft="@dimen/margin_horizontal_small"
        android:layout_marginEnd="@dimen/margin_horizontal_small"
        android:layout_marginRight="@dimen/margin_horizontal_small"
        android:layout_marginTop="@dimen/margin_vertical_small"
        >
    </ImageView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_establishment_name"
            android:layout_marginTop="@dimen/margin_vertical_normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/font_size_large"
            android:text="Bar Alternativo"
            android:textColor="@color/black"
            >
        </TextView>

        <RelativeLayout
            android:layout_marginTop="@dimen/margin_vertical_small"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tv_establishment_type"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/font_size_tiny"
                android:text="Pub / Bar"
                android:textColor="@color/gray_60_percent"
                >
            </TextView>

            <ImageView
                android:id="@+id/iv_establishment_working_status_icon"
                android:src="@drawable/img_dot_green"
                android:layout_marginStart="@dimen/margin_horizontal_big"
                android:layout_marginLeft="@dimen/margin_horizontal_big"
                android:layout_toRightOf="@+id/tv_establishment_type"
                android:layout_toEndOf="@+id/tv_establishment_type"
                android:layout_width="17dp"
                android:layout_height="17dp" />

        </RelativeLayout>

        <LinearLayout
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            >

            <TextView
                android:id="@+id/tv_establishment_opening_time"
                android:layout_marginTop="@dimen/margin_vertical_normal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/font_size_very_tiny"
                android:textColor="@color/gray_30_percent"
                android:text="19:00"
                >
            </TextView>

            <TextView
                android:id="@+id/tv_establishment_separator_time"
                android:layout_marginTop="@dimen/margin_vertical_normal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/font_size_very_tiny"
                android:text="@string/str_screen_txt_hyphen"
                android:textColor="@color/gray_30_percent"
                >
            </TextView>

            <TextView
                android:id="@+id/tv_establishment_closing_time"
                android:layout_marginTop="@dimen/margin_vertical_normal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/font_size_very_tiny"
                android:text="02:00"
                android:textColor="@color/gray_30_percent"
                >
            </TextView>

            <TextView
                android:id="@+id/tv_establishment_place_distance"
                android:layout_marginTop="10dp"
                android:layout_width="wrap_content"
                android:layout_marginLeft="@dimen/margin_horizontal_normal"
                android:layout_marginStart="@dimen/margin_horizontal_normal"
                android:layout_height="wrap_content"
                android:textSize="@dimen/font_size_very_tiny"
                >
            </TextView>

        </LinearLayout>

    </LinearLayout>
</LinearLayout>

编辑: 我尝试编辑图标的大小,它反射(reflect)在所有行的大小中,所以我认为 ImageView 在 laoyut 中,但没有图像。

编辑2 添加红点和绿点: enter image description here enter image description here

但是我不认为图像是问题所在,因为第一行应该显示绿点,但事实并非如此。

编辑3 这是我的观众:

public class EstablishmentViewHolder extends RecyclerView.ViewHolder {

    public ImageView ivIcon;
    public TextView tvName;
    public ImageView ivWorkingStatus;
    public TextView tvOpeningTime;
    public TextView tvClosingTime;
    public TextView tvPlaceDistance;
    public TextView tvType;

    public byte idContractType;

    public EstablishmentViewHolder(View itemView, byte idContractType {
        super(itemView);

        this.ivIcon = (ImageView) itemView.findViewById(R.id.iv_establishment_icon);
        this.tvName = (TextView) itemView.findViewById(R.id.tv_establishment_name);
        this.ivWorkingStatus = (ImageView) itemView.findViewById(R.id.iv_establishment_working_status_icon);
        this.tvOpeningTime = (TextView) itemView.findViewById(R.id.tv_establishment_opening_time);
        this.tvClosingTime = (TextView) itemView.findViewById(R.id.tv_establishment_closing_time);
        this.tvPlaceDistance = (TextView) itemView.findViewById(R.id.tv_establishment_place_distance);
        this.tvType = (TextView) itemView.findViewById(R.id.tv_establishment_type);
        this.idContractType = idContractType;
    }
}

最佳答案

问题在于您将 ImageView 的左侧与 TextView 的右侧对齐!!!

<RelativeLayout
        android:layout_marginTop="@dimen/margin_vertical_small"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tv_establishment_type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/font_size_tiny"
            android:text="Pub / Bar"
            android:textColor="@color/gray_60_percent"
            >
        </TextView>

        <ImageView
            android:id="@+id/iv_establishment_working_status_icon"
            android:src="@drawable/img_dot_green"
            android:layout_marginStart="@dimen/margin_horizontal_big"
            android:layout_marginLeft="@dimen/margin_horizontal_big"
            android:layout_toRightOf="@+id/tv_establishment_type"
            android:layout_toEndOf="@+id/tv_establishment_type"
            android:layout_width="17dp"
            android:layout_height="17dp" />

    </RelativeLayout>

随着文本的增长,您将看不到任何图像。尝试使用具有重力权的 Linearlayout 并将 textview 的权重设置为 1

关于android - RecyclerView适配器布局不显示图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983937/

相关文章:

android - Firebase 应用数据收集是否需要在 Play 管理中心的数据安全表单中声明?

android - Firebase 实时数据库和 Kotlin 协程

java - sqlite中的超时异常

java - 如何使用adapter.notifyDataSetChanged();我必须使用这些行来解决我的错误

java - 从 Activity 获取值到自定义数组适配器

android - 从 afterTextChanged() 更新适配器

android - 如何增加 webrtc 中的麦克风增益

android - 使用自定义状态,onCreateDrawableState 从未调用过

android - 加载图像后测量 ImageView

java - 将 JavaFX 图像转换为 BufferedImage