Java 如何在单击视图时加载不同的视图类型?
我在recyclerview中显示一个事务列表。现在,我想在单击第一个视图类型的父布局时显示另一个视图 我为这两种视图类型创建了不同的布局和不同的支架 我想知道如何在单击第一个视图类型的父布局时显示第二个视图类型 这是我的适配器:Java 如何在单击视图时加载不同的视图类型?,java,android,android-recyclerview,multiple-views,Java,Android,Android Recyclerview,Multiple Views,我在recyclerview中显示一个事务列表。现在,我想在单击第一个视图类型的父布局时显示另一个视图 我为这两种视图类型创建了不同的布局和不同的支架 我想知道如何在单击第一个视图类型的父布局时显示第二个视图类型 这是我的适配器: public class TransactionHistoryListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<Transact
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();
}
}
公共类TransactionHistoryListAdapter扩展了RecyclerView.Adapter{
私人清单交易清单;
私有上下文;
//静态变量
静态最终整数类型负载传输=0,类型负载传输细节=1;
公共事务HistoryListAdapter(列表事务列表,上下文){
this.mContext=上下文;
this.transactionList=transactionList;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder ViewHolder=null;
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
开关(视图类型){
箱体类型\负载\变速箱:
查看v_标题=充气机。充气(R.layout.transaction_item_布局,父项,false);
viewHolder=新的TransactionHistoryListHolder(v_标题);
打破
箱子类型、荷载、运输详情:
视图v_header1=充气机。充气(R.layout.transaction_detail_layout,parent,false);
viewHolder=新交易详情持有人(v_header1);
打破
}
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
如果(getItemViewType(位置)=类型\u加载\u传输){
TransactionHistoryListHolder transsHolder=(TransactionHistoryListHolder)持有人;
RetrieveAllTrans(transsHolder,位置);
}否则{
}
}
公共无效检索AllTrans(最终交易历史记录持有人,最终int位置){
最终交易数据=transactionList.get(位置);
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(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
getItemViewType(位置);
}
});
}
@凌驾
public int getItemViewType(int位置){
Object obj=transactionList.get(位置);
if(事务的obj实例){
返回类型\负载\传输;
}else if(事务的obj实例){
返回类型\负载\传输详细信息;
}
返回super.getItemViewType(位置);
}
@凌驾
public int getItemCount(){
返回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
,正如谷歌建议的那样,您不应该使用position作为final,而是让holder作为final,然后在侦听器中获得这样的位置是否有问题?在getItemViewTypê中,if和else if似乎是相同的条件。我的对象对于两种视图类型都是相同的。我可以为两种视图保留相同的对象吗?@liltofYes,但在对象中,您应该有一个属性,告诉您应该显示什么类型的视图。然后,当您单击父视图时,只需更改属性值,并调用notifyItemChanged,这将重新绘制项目,从而更改显示的视图类型。您能帮我修改代码吗?@liltofgreat它工作得很好。。现在所有项目都显示出来了,很多次,我只想在点击项目时显示一次,如果显示,则隐藏它,如果点击项目a并显示视图类型,则如果点击下一个项目,则应隐藏a并显示给b。我不明白。如果您只想在再次单击时返回上一个类型,那么您只需在onClickListener中执行以下操作:If(type==1){transaction.get(holder.getAdapterPosition()).typeToDisp=0;},然后再次调用notifyItemChanged。如果要将其从列表中删除,则如果type==1,则将其从transactionlist对象中删除,并为该位置调用notifyItemRemoved。如果这个答案对你来说是可以的,你能把它标记为接受吗?我注意到上面的代码,它的隐藏视图1和显示视图2在它的位置,我想显示两者。点击视图1,它会在视图1下面显示视图2。哦!好啊然后您必须在transactionlist中单击的事务之后插入一个事务(相同的事务,但类型为1,然后调用notifyItemInserted(holder.getAdapterPosition()+1)。在单击侦听器中执行此操作,当然不要调用transaction.get(holder.getAdapterPosition()).typeToDisp=1;notifyItemChanged(holder.getAdapterPosition())它将在每次单击时插入。