在执行时添加一行到一个空的recyclerview

时间:2016-02-25 10:26:52

标签: android android-recyclerview

我的活动有一个AutoCompleteTextView和一个按钮,在它下面是一个隐藏的RecyclerView,它开始为空(没有行)。

使用AutoCompleteTextView,我选择一个对象,我想要的是,当我单击按钮时,将该对象添加到RecyclerView(并打开回收器的可见性)。 / p>

到目前为止,我已设法将对象添加到回收器的DataSet中,但它不会在notifyDataSetChanged()上显示任何行。

布局:

<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
<ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:id="@+id/ib_add"
        android:src="@drawable/ic_add_black"
        android:onClick="onAddClick"/>

<AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/actv_input"
        android:layout_toLeftOf="@+id/ib_add"
        android:layout_toStartOf="@+id/ib_add"
        android:hint="@string/name_hint"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"/>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>

活动(只是相关功能):

@Bind(R.id.rv) RecyclerView rv;

ArrayList<Ing> ings = new ArrayList<>();
ArrayList<Ing> selectedIngs = new ArrayList<>();

private void setupRecyclers() {
    rv.setLayoutManager(new LinearLayoutManager(this));
    rv.setAdapter(new RecyclerViewAdapter(selectedIngs));
}

public void onAddClick(View view) {
    Ing ing = ings.get(selectedPosition);
    rv.setVisibility(View.VISIBLE);
    selectedIngs.add(ing);
    ((RecyclerViewAdapter)rv.getAdapter()).addIng(ing);
}

RecyclerViewAdapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RViewHolder> {

ArrayList<Ing> ings;

public RecyclerViewAdapter(ArrayList<Ing> ings) {
    this.ings = ings;
}

@Override
public RViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_ing, parent, false);
    return new RViewHolder(row);
}

@Override
public void onBindViewHolder(RViewHolder holder, int position) {
    Ing ing = ings.get(position);
    holder.bindToView(ing);
}

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

public void addIng(Ing ing) {
    ings.add(ing);
    notifyDataSetChanged();
}

public void setDataSet(ArrayList<Ing> ings) {
    this.ings = ings;
    notifyDataSetChanged();
}
}

RecyclerViewHolder:

public class RViewHolder extends RecyclerView.ViewHolder {

Ing ing;
ImageView ivIcon;
TextView tvName;
ImageButton ibRemove;
TextView tvPercentage;
EditText etPercentage;

public RViewHolder(View row) {
    super(row);

    bindFields(row);
}

private void bindFields(View view) {

    ivIcon = (ImageView) view.findViewById(R.id.iv_icon_type);
    tvName = (TextView) view.findViewById(R.id.tv_ing);
    ibRemove = (ImageButton) view.findViewById(R.id.btn_remove);
    tvPercentage = (TextView) view.findViewById(R.id.tv_percentage);
    etPercentage = (EditText) view.findViewById(R.id.et_percentage);

}

public void bindToView(Ing ing){
    this.ing = ing;

    tvName.setText(ing.getName());
    ivIcon.setImageResource(R.drawable.icon);
    tvName.setVisibility(View.VISIBLE);
    ivIcon.setVisibility(View.VISIBLE);
    ibRemove.setVisibility(View.VISIBLE);
    tvPercentage.setVisibility(View.VISIBLE);
    etPercentage.setVisibility(View.VISIBLE);
}
}

我错过了什么? 谢谢!

1 个答案:

答案 0 :(得分:0)

解决!

第一部分,回收商甚至没有显示内部元素,由23.2.0支持库的更新修复,引入了对recyclerviews的自动测量。在此之前,如果你在一个嵌套的亲戚中有一个回收者,它做了一些有趣的事情,从来没有初始化回收者内部的行。

第二部分,没有添加行的按钮,是因为即使你在图像按钮中设置了一些onclick事件,它看起来你必须把android:clickable = true,否则它将无效。 / p>