java - 如何在点击 View 时加载不同的 View 类型?

标签 java android android-recyclerview multiple-views

我在 recyclerview 中显示了一份交易 list 。我现在想在单击第一个 View 类型的父布局时显示另一个 View 。

我为两种 View 类型创建了不同的布局和不同的支架。

我想知道我们如何显示第一个 View 类型的父布局的第二个 View 类型 onClick。

这是我的适配器:

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

    private List<Transaction> transactionList;
    private Context mContext;
    //static var
    static final int TYPE_LOAD_TRANS = 0, TYPE_LOAD_TRANS_DETAIL = 1;


    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;

            case TYPE_LOAD_TRANS_DETAIL:
                View v_header1 = inflater.inflate(R.layout.transaction_detail_layout, parent, false);
                viewHolder = new TransactionDetailHolder(v_header1);
                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) {

                getItemViewType(position);

            }
        });

    }

    @Override
    public int getItemViewType(int position) {

        Object obj = transactionList.get(position);

        if (obj instanceof Transaction) {
            return TYPE_LOAD_TRANS;
        } else if (obj instanceof Transaction) {
                return TYPE_LOAD_TRANS_DETAIL;
            }

        return super.getItemViewType(position);
    }

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

请帮忙。谢谢。

最佳答案

我认为问题出在您的 getItemView 类型方法上:

你应该这样做:

    Transaction obj = transactionList.get(position);

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

    return super.getItemViewType(position);

然后在您的 onClickListener 中,您只需更改类型,然后调用 notifyItemChanged,如下所示:

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

            int type = transaction.get(holder.getAdapterPosition()).typeToDisp;
            if (type == 0)
                { 
                   transaction.get(holder.getAdapterPosition()).typeToDisp = 1;
                   notifyItemChanged(holder.getAdapterPosition())
                } 

        }
    });

请注意,我使用 holder.getAdapterPosition,按照 google 的建议,你不应该使用 position 作为 final,而是让 holder final 并在监听器中获得这样的位置

关于java - 如何在点击 View 时加载不同的 View 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369778/

相关文章:

java - recyclerview onclicklistener java.lang.IndexOutOfBoundsException : Invalid index 0, 大小为0

java - 遍历树收集节点组合

Java:为 JFrame 及其组件添加 KeyListener

java - 设置 jar 文件

java - 是否可以仅显示已配对、开启且在范围内的蓝牙设备的 Activity 列表,而不是显示所有先前配对的设备?

android - 当我更新时,Recyclerview 位置更改为第一个位置

android - 具有褪色边缘的水平回收 View

java - Spring 应用程序在 8 小时后失去与 MySql 的连接。如何正确配置?

java - 如何将捕获的异常与异步任务android中的标准异常进行比较?

Android 使用线性布局 maxWidth,不适用于 fill_parent