简体   繁体   English

如何显示列表中一项的视图并隐藏其他项?

[英]How to show view for one item in a list and hide from others.?

I have a list with recycler view. 我有一个带有回收站视图的列表。 I am showing another layout , on click of its parent layout of an item. 单击项目的父级布局时,我正在显示另一种布局。

Now as I click items in list it shows the view for all the items, now I want to make the layout visible for only the clicked item and make it gone for other items. 现在,当我单击列表中的项目时,它显示了所有项目的视图,现在我要使布局仅对单击的项目可见,而对其他项目消失。

Layout detail should only be visible on click of an item and only to the clicked item. 布局详细信息仅在单击项目时才可见,并且仅对单击的项目可见。

Layout: 布局:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"

    android:id="@+id/lay_row"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="false"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        xmlns:app="http://schemas.android.com/tools"
        android:id="@+id/card_view"
        app:cardUseCompatPadding="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="05dp"
        android:layout_marginTop="05dp"
        card_view:cardElevation="12dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@color/bg">

            <View
                android:layout_width="3dp"
                android:layout_height="match_parent"
                android:background="@color/cardLineColor"></View>

            <LinearLayout
                android:id="@+id/linearLayout6"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginEnd="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginStart="10dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/txt_id"
                    android:layout_width="103dp"
                    android:layout_height="wrap_content"
                    android:text="ID"
                    android:textColor="@color/white" />

                <TextView
                    android:id="@+id/txt_date"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="05dp"
                    android:text="23/3/2015"
                    android:textColor="@color/textColor"
                    android:textSize="10sp" />


            </LinearLayout>

            <TextView
                android:id="@+id/txt_trans_type"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/linearLayout6"
                android:layout_centerHorizontal="true"
                android:text="sent money"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <LinearLayout
                android:id="@+id/linearLayout8"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignTop="@+id/linearLayout6"
                android:layout_marginEnd="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginStart="10dp"
                android:layout_toEndOf="@+id/txt_trans_type"
                android:layout_toRightOf="@+id/txt_trans_type"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/txt_balance"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:text="$3214"
                    android:textAlignment="viewEnd"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:layout_marginTop="05dp"
                    android:text="@string/balance"
                    android:textAlignment="viewEnd"
                    android:textColor="@color/white"
                    android:textSize="10sp" />


            </LinearLayout>
        </RelativeLayout>


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

    <RelativeLayout
        android:id="@+id/relativeLayout_detail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone">

        <RelativeLayout
            android:id="@+id/relativeLayout1"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:background="@drawable/trans_background">

            <View
                android:id="@+id/view"
                android:layout_width="2dp"
                android:layout_height="match_parent"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginBottom="2dp"
                android:layout_marginTop="2dp"
                android:background="@color/cardLineColor1"></View>

            <LinearLayout
                android:id="@+id/linearLayout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginStart="10dp"
                android:layout_toLeftOf="@+id/linearLayout86"
                android:layout_toStartOf="@+id/linearLayout86"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/txt_vendor"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/vendor"
                    android:textColor="@color/lightGrey" />

                <TextView
                    android:id="@+id/txt"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="05dp"
                    android:text="@string/vendor"
                    android:textColor="@color/white"
                    android:textSize="10sp" />


            </LinearLayout>

            <LinearLayout
                android:id="@+id/linearLayout86"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_marginEnd="10dp"
                android:layout_marginRight="10dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/txt_trans_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="ID"
                    android:textColor="@color/lightGrey" />

                <TextView
                    android:id="@+id/txt_7"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="05dp"
                    android:text="@string/transId"
                    android:textColor="@color/white"
                    android:textSize="10sp" />


            </LinearLayout>
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/relativeLayout2"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/relativeLayout1"
            android:background="@drawable/trans_background">

            <View
                android:layout_width="2dp"
                android:layout_height="match_parent"
                android:layout_marginBottom="2dp"
                android:layout_marginTop="2dp"
                android:background="@color/cardLineColor1"></View>

            <LinearLayout
                android:id="@+id/linearLayout9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginStart="10dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/txt_credit"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="$5858.0"
                    android:textColor="@color/lightGrey" />

                <TextView
                    android:id="@+id/txt5"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="05dp"
                    android:text="@string/credit"
                    android:textColor="@color/white"
                    android:textSize="10sp" />


            </LinearLayout>
        </RelativeLayout>
    </RelativeLayout>
</LinearLayout>

Adapter: 适配器:

public class TransactionHistoryListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Transaction> transactionList;
    private Context mContext;
    static final int TYPE_LOAD_TRANS = 0;



    public TransactionHistoryListAdapter(List<Transaction> transactionsList, Context context) {
        this.mContext = context;
        this.transactionList = transactionsList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (viewType) {

            case TYPE_LOAD_TRANS:
                View v_header = inflater.inflate(R.layout.transaction_item_layout, parent, false);
                viewHolder = new TransactionHistoryListHolder(v_header);
                break; 

        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if (getItemViewType(position) == TYPE_LOAD_TRANS) {
            TransactionHistoryListHolder transsHolder = (TransactionHistoryListHolder) holder;
            retriveAllTrans(transsHolder, position);
        } else {
        }

    }
    public void retriveAllTrans(final TransactionHistoryListHolder holder, final int position) {


        final Transaction data = transactionList.get(position);


        holder.txt_id.setText(data.getId());
        holder.txt_date.setText(data.getDate());
        holder.txt_trans_type.setText(data.getType());
        holder.txt_balance.setText(data.getBalance());


        holder.lay_row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                holder.relativeLayout.setVisibility(View.VISIBLE);

            }
        });

    }

    @Override
    public int getItemViewType(int position) {

        Transaction obj = transactionList.get(position);

        if (obj.typeToDisp == 0) {
            return TYPE_LOAD_TRANS;
        }
        return super.getItemViewType(position);
    }

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

How can we do it? 我们该怎么做?

EDIT : 编辑:

I tried to do this way : 我试图这样做:

   public class TransactionHistoryListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public TransactionHistoryListAdapter(List<Transaction> transactionsList, Context context) {
        this.mContext = context;
        this.transactionList = transactionsList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (viewType) {

            case TYPE_LOAD_TRANS:
                View v_header = inflater.inflate(R.layout.transaction_item_layout, parent, false);
                viewHolder = new TransactionHistoryListHolder(v_header);
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Transaction data = transactionList.get(position);
        if (getItemViewType(position) == TYPE_LOAD_TRANS) {


            TransactionHistoryListHolder transsHolder = (TransactionHistoryListHolder) holder;

            if (data.isVisible()){
                transsHolder.relativeLayout.setVisibility(View.VISIBLE);
            } else {
                transsHolder.relativeLayout.setVisibility(View.GONE);
            }

            retriveAllTrans(transsHolder, position);
        } else {
        }

    }

    public void retriveAllTrans(final TransactionHistoryListHolder holder, final int position) {


        final Transaction data = transactionList.get(position);


        holder.txt_id.setText(data.getId());
        holder.txt_date.setText(data.getDate());
        holder.txt_trans_type.setText(data.getType());
        holder.txt_balance.setText(data.getBalance());


        holder.lay_row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {



               if (data.isVisible()) { // initially it will be falsedata.setVisible(false);

                    data.setVisible(true);
                    holder.relativeLayout.setVisibility(View.VISIBLE);
                    notifyDataSetChanged();

                } else {
                   data.setVisible(false);
                    holder.relativeLayout.setVisibility(View.GONE);
                   notifyDataSetChanged();

                }


            }
        });


        for (int i=0;i< transactionList.size();i++)
        {
            if(i==position) {
                data.setVisible(true);
            }
            else {
                data.setVisible(false);
            }
        }


    }

    }
    @Override
    public int getItemViewType(int position) {

        Transaction obj = transactionList.get(position);

        if (obj.typeToDisp == 0) {
            return TYPE_LOAD_TRANS;
        } 

        return super.getItemViewType(position);
    }

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

Its not working out. 它没有解决。

Please help. 请帮忙。 Thank you.. 谢谢..

Maintain the flag in you model to hold the view state and show only if the condition satisfied with your model. 维护模型中的标记以保持视图状态,并仅在条件满足模型时才显示。 For your reference in your Transaction model declare the field like this 供您在事务模型中参考,请声明如下字段

public class Transaction {
 .....
 boolean isVisible;

 public void setIsVisible(boolean isVisible){
   this.isVisible = isVisible;
  }

 public boolean isVisible(){
    return isVisible;
 }
 }

then in you adapter class inside onClickListener set flag like this 然后在您的适配器类里面的onClickListener设置标志,像这样

   holder.lay_row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (data.isVisble()) { // initially it will be false
            data.setIsVisible(false);
            holder.relativeLayout.setVisibility(View.GONE);
            } else {
            data.setIsVisible(true);
            holder.relativeLayout.setVisibility(View.Visible);
            }

        }
    });

this will show your view but on scrolling views will be recycled and set to default state so to overcome this issue you must update your view state inside onBindView 这将显示您的视图,但在滚动视图时将被回收并设置为默认状态,因此要解决此问题,您必须在onBindView中更新视图状态

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
     final Transaction data = transactionList.get(position);
    if (getItemViewType(position) == TYPE_LOAD_TRANS) {
        if (data.isVisible()){
        holder.relativeLayout.setVisibility(View.VISIBLE);
        } else {
         holder.relativeLayout.setVisibility(View.GONE);
         }
        TransactionHistoryListHolder transsHolder = (TransactionHistoryListHolder) holder;
        retriveAllTrans(transsHolder, position);
    } else {
    }

 }

this will fix your issue 这将解决您的问题

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

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