Android 在重复数据时更改视图的可见性
我通过从应用程序中的服务器检索数据来填充OrderHistory。这里我需要根据OrderId填充listitem。如果OrderId重复,我需要隐藏屏幕截图中以绿色标记的LinearLayout。否则,布局必须是常规视图。请帮助我 MyAdapter类:Android 在重复数据时更改视图的可见性,android,android-recyclerview,visibility,listitem,Android,Android Recyclerview,Visibility,Listitem,我通过从应用程序中的服务器检索数据来填充OrderHistory。这里我需要根据OrderId填充listitem。如果OrderId重复,我需要隐藏屏幕截图中以绿色标记的LinearLayout。否则,布局必须是常规视图。请帮助我 MyAdapter类: public class MyOrderAdapter extends RecyclerView.Adapter<MyOrderAdapter.ViewHolder> { Context mContext; Li
public class MyOrderAdapter extends RecyclerView.Adapter<MyOrderAdapter.ViewHolder> {
Context mContext;
List<CartRes> mOrderList = new ArrayList<>();
private ImageLoader imageLoader;
public MyOrderAdapter(Context context, List<CartRes> orderList) {
mContext = context;
mOrderList = orderList;
Log.e("Json Adapter", "" + mOrderList);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_order_history, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.cartResOrder = mOrderList.get(position);
imageLoader = CustomVolleyRequest.getInstance(mContext).getImageLoader();
String IMAGE_URL = "http://" + Config.IMAGE_URL + holder.cartResOrder.ORDER_IMAGE;
Log.e("Image URL", IMAGE_URL + " " + holder.cartResOrder.ORDER_IMAGE);
imageLoader.get(IMAGE_URL, ImageLoader.getImageListener(holder.orderImage, 0, 0));
holder.orderImage.setImageUrl(IMAGE_URL, imageLoader);
holder.txtOrderId.setText(holder.cartResOrder.ORDER_ID);
holder.txtOrderProduct.setText(holder.cartResOrder.ORDER_PRODUCT);
holder.txtorderedDate.setText(holder.cartResOrder.ORDER_DATE);
holder.txtDeliveredDate.setText(holder.cartResOrder.ORDER_DELIVERY_DATE);
}
@Override
public int getItemCount() {
return mOrderList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView txtOrderId, txtOrderProduct, txtorderedDate, txtDeliveredDate;
Button butDetail, butRemove;
NetworkImageView orderImage;
CartRes cartResOrder;
public ViewHolder(View itemView) {
super(itemView);
txtOrderId = (TextView) itemView.findViewById(R.id.orderId);
txtOrderProduct = (TextView) itemView.findViewById(R.id.orderProduct);
txtorderedDate = (TextView) itemView.findViewById(R.id.orderedDate);
txtDeliveredDate = (TextView) itemView.findViewById(R.id.orderDeliveredDate);
butDetail = (Button) itemView.findViewById(R.id.orderViewDetail);
butRemove = (Button) itemView.findViewById(R.id.orderRemove);
orderImage = (NetworkImageView) itemView.findViewById(R.id.OrderproductImage);
}
}
}
屏幕截图没有说明这一点,但是如果您的视图是RecyclerView或ListView,那么我会在将数据提供给适配器之前对其进行预处理(即,通过将您的模型包装到另一个具有附加属性的类中)
或者,您可以尝试在填充当前行的同时检查上一行(通过从数据源或适配器获取数据),并调整视图屏幕截图不会显示这一点,但如果您的视图是RecyclerView或ListView,则我会在将数据馈送到适配器之前对其进行预处理(即,通过将模型包装到另一个具有附加属性的类中)
或者,您可以尝试检查前一行(通过从数据源或适配器获取它)在填充当前项并调整视图时可能只需将字段
boolean repeatOrderId
添加到您的CartRes
类中,并在构造函数中对所有项执行一些循环和标记?您也可以在运行时进行检查,但您有一个非常固定的列表,在构造函数中准备此标记对性能更有利
for(int i=0; i<mOrderList.getCount(); i++){
CartRes cr = mOrderList.get(i);
cr.repeatOrderId=true;
for(int j=0; j<i; j++){
if(cr.ORDER_ID==mOrderList.get(j).ORDER_ID){
cr.repeatOrderId=false; //default true
break;
}
}
}
for(int i=0;i也许只需将字段boolean repeatOrderId
添加到您的CartRes
类中,然后在构造函数中对循环并标记所有项?您也可以在运行时检查,但您有一个非常固定的列表,在构造函数中准备此标记对性能更好
for(int i=0; i<mOrderList.getCount(); i++){
CartRes cr = mOrderList.get(i);
cr.repeatOrderId=true;
for(int j=0; j<i; j++){
if(cr.ORDER_ID==mOrderList.get(j).ORDER_ID){
cr.repeatOrderId=false; //default true
break;
}
}
}
for(int i=0;i一种方法:
拥有一个新的holder变量,该变量引用要隐藏的线性布局
在您的onBindViewHolder()中
编辑:
我假设里面的数据是按ORDER_ID排序的,所以不会有两个元素具有相同的ORDER_ID,但彼此不相邻的情况
在将列表传递到适配器之前,您可能希望根据ORDER_ID对它们进行排序
EDIT2:
public void onBindViewHolder(ViewHolder holder, int position) {
holder.cartResOrder = mOrderList.get(position);
imageLoader = CustomVolleyRequest.getInstance(mContext).getImageLoader();
String IMAGE_URL = "http://" + Config.IMAGE_URL + holder.cartResOrder.ORDER_IMAGE;
Log.e("Image URL", IMAGE_URL + " " + holder.cartResOrder.ORDER_IMAGE);
imageLoader.get(IMAGE_URL, ImageLoader.getImageListener(holder.orderImage, 0, 0));
holder.orderImage.setImageUrl(IMAGE_URL, imageLoader);
holder.txtOrderId.setText(holder.cartResOrder.ORDER_ID);
holder.txtOrderProduct.setText(holder.cartResOrder.ORDER_PRODUCT);
holder.txtorderedDate.setText(holder.cartResOrder.ORDER_DATE);
holder.txtDeliveredDate.setText(holder.cartResOrder.ORDER_DELIVERY_DATE);
if (position > 0 && mOrderList.get(position).ORDER_ID == mOrderList.get(position - 1).ORDER_ID) {
//make sure it is not the first one, and make sure it has the same ID as previous.
holder.OrderLinear.setVisibility(View.GONE); //hide it, you need to set the reference first.
holder.txtOrderId.setVisibility(View.GONE);
}
}
添加了注释中建议的else条件。一种方法:
拥有一个新的holder变量,该变量引用要隐藏的线性布局
在您的onBindViewHolder()中
编辑:
我假设里面的数据是按ORDER_ID排序的,所以不会有两个元素具有相同的ORDER_ID,但彼此不相邻的情况
在将列表传递到适配器之前,您可能希望根据ORDER_ID对它们进行排序
EDIT2:
public void onBindViewHolder(ViewHolder holder, int position) {
holder.cartResOrder = mOrderList.get(position);
imageLoader = CustomVolleyRequest.getInstance(mContext).getImageLoader();
String IMAGE_URL = "http://" + Config.IMAGE_URL + holder.cartResOrder.ORDER_IMAGE;
Log.e("Image URL", IMAGE_URL + " " + holder.cartResOrder.ORDER_IMAGE);
imageLoader.get(IMAGE_URL, ImageLoader.getImageListener(holder.orderImage, 0, 0));
holder.orderImage.setImageUrl(IMAGE_URL, imageLoader);
holder.txtOrderId.setText(holder.cartResOrder.ORDER_ID);
holder.txtOrderProduct.setText(holder.cartResOrder.ORDER_PRODUCT);
holder.txtorderedDate.setText(holder.cartResOrder.ORDER_DATE);
holder.txtDeliveredDate.setText(holder.cartResOrder.ORDER_DELIVERY_DATE);
if (position > 0 && mOrderList.get(position).ORDER_ID == mOrderList.get(position - 1).ORDER_ID) {
//make sure it is not the first one, and make sure it has the same ID as previous.
holder.OrderLinear.setVisibility(View.GONE); //hide it, you need to set the reference first.
holder.txtOrderId.setVisibility(View.GONE);
}
}
添加了注释中建议的其他条件。能否显示当前如何输出的代码?请检查我的代码。下面显示的项目是否在不同的布局和不同的项目中以绿色标记?与其多次重复相同的订单id,我需要隐藏它是否重复。否则它必须显示Yeah..Tha绿色linearLayout@rajenraiyarelau下面的不同linearLayout可以显示您当前输出的代码吗?请检查我的代码。在绿色linearLayout下面显示的项目是否在不同的布局和不同的项目中?与其多次重复相同的订单id,我需要隐藏它是否重复。否则它必须be shownYeah..这是不同的linearLayout,在绿色linearLayout@rajenraiyarela下面,当第一次尝试第二种方法时,它是Recycleriver。当第一次尝试第二种方法时,它是Recycleriver。希望他不会对列表进行排序。没有看到任何用于筛选/排序的代码,但如果需要,此代码可能会在每次更改列表后运行(在notifyDataSetChanged
之前),不要忘记对之前的所有项目将此标志“重置”为true
。或者类似于回答:动态检查onBindViewHolder
(但这不是最佳做法)感谢您的回答希望他不会对列表进行排序。没有看到任何用于筛选/排序的代码,但如果需要,此代码可能会在每次列表更改后运行(在notifyDataSetChanged
之前),不要忘了“重置”对于之前的所有项目,将此标志设置为true
。或者类似于回答:动态检查onBindViewHolder
(但这不是最佳做法)感谢您的回答如果相同的订单ID
项目不在另一个项目旁边,则此标志无效(作者应对此进行精确说明)你的方法很简单,可能对Parama Sudha来说已经足够了,让我们等待他的评论:)请检查我的更新。这是正确的吗?我尝试了,但没有得到我期望的结果。它应该是正确的。ORDER_ID是什么类型?你可能需要使用.equals()
进行比较。@Paramasuda确保在else条件下,您也可以再次查看视图。如果相同的订单ID
项目不相邻,则无法进行比较(作者应对此进行精确说明)。您的方法很简单,对于Parama Sudha来说可能已经足够了,让我们等待他的评论:)请检查我的更新。这是正确的吗?我尝试了,但没有得到我期望的结果。它应该是正确的。订单ID是什么类型的?您可能需要使用.equals()
来比较它。@Paramasuda确保在其他情况下您也可以再次查看视图。