0

我有兩個選項卡(片段),NewOrders和FinishedOrders,我通過排球的請求,現在新訂單標籤內的每個項目填充訂單有着SwipeLayout它顯示一個可點擊的TextView,使順序完成,並將其移動到另一個選項卡(後端的東西..),我得到了這個完美的工作,刪除recyclerview項目

問題是,當我點擊完成,一旦請求發送成功,recyclerview不更新,我必須做拉到刷新,所以它會更新..!它似乎很容易解決,但問題是處理適配器內的onBindView方法內完成swipelayout監聽器..!這是根據我正在使用的圖書館(我猜)只能訪問它的地方..!另一方面刷新和填充列表發生在NewOrder標籤片段中。 那麼,如何讓物品在點擊後從列表中刪除並更新..?!

任何想法..!?

我的適配器類別+ ViewHolder

注:在適配器的實現方法是必要的,因爲SwipeLayout庫接口的

public class OrdersDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 
    implements SwipeAdapterInterface, SwipeItemMangerInterface { 

protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this); 

public Context context; 
ArrayList<OrderPresenter> orders; 


public OrdersDataAdapter(ArrayList<OrderPresenter> orders, Context context) { 
    this.orders = orders; 
    this.context = context; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_card, parent, false); 

    return new NewOrderVH(v); 

} 


@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
    final OrderPresenter order = this.orders.get(position); 
    final NewOrderVH vh1 = (NewOrderVH) holder; 

    vh1.setData(orders.get(position)); 
    mItemManger.bindView(vh1.itemView, position); 
    vh1.swipeLayout.setShowMode(SwipeLayout.ShowMode.PullOut); 
    vh1.swipeLayout.addDrag(SwipeLayout.DragEdge.Left, 
    vh1.swipeLayout.findViewById(R.id.bottom_wrapper)); 


    if (order.isFinished()) { 
     vh1.swipeLayout.setSwipeEnabled(false); 
     vh1.setBadge("DONE");    
     vh1.setBadgeColor(order.getBadgeColor()); 

    } else { 

     vh1.finish.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // get the clicked item position? 
       final int position = vh1.getAdapterPosition(); 

      // these responsible for the request which make the order finished 
       OrderPresenter order = orders.get(position); 
       OrderRepository.setOrderFinURL(order.getID()); 
       OrderRepository.FinishOrder(order.getID(), context); 

     /*the commented three lines below didn't help with the problem*/ 
       // notifyItemChanged(position); 
       // notifyItemRemoved(position); 
       // notifyDataSetChanged();*/ 

       order.setStatus(order.getStatusText(Order.FINISHED)); 

      } 
     }); 
    } 


} 


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


public class NewOrderVH extends RecyclerView.ViewHolder { 

    SwipeLayout swipeLayout; 
    private TextView finish; 
    private CardView orderCard; 
    TextView Badge; 
    private ImageView cusPic; 
    private TextView cusName; 
    private TextView CusAdress; 
    private TextView vendorsNum; 
    private TextView itemsNum; 
    private TextView time; 
    private TextView emptyView; 


    public NewOrderVH(View itemView) { 
     super(itemView); 

     Badge = (TextView) itemView.findViewById(R.id.badge); 
     swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe); 
     finish = (TextView) itemView.findViewById(R.id.finish); 
     orderCard = (CardView) itemView.findViewById(R.id.OrderCard); 
     cusPic = (ImageView) itemView.findViewById(R.id.cusPic); 
     cusName = (TextView) itemView.findViewById(R.id.cusName); 
     CusAdress = (TextView) itemView.findViewById(R.id.CusAdress); 
     vendorsNum = (TextView) itemView.findViewById(R.id.vendorsNum); 
     itemsNum = (TextView) itemView.findViewById(R.id.itemsNum); 
     time = (TextView) itemView.findViewById(R.id.time); 
     emptyView = (TextView) itemView.findViewById(R.id.empty_view); 


     orderCard.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(v.getContext(), OrderDetails.class); 
       v.getContext().startActivity(intent); 
      } 
     }); 
    } 


    public void setData(final OrderPresenter data) { 

     time.setText(data.getOrderTime()); 
     cusName.setText(data.getFullName()); 
     vendorsNum.setText(data.getVendorsCount()); 
     itemsNum.setText(data.getItemsCount()); 
     CusAdress.setText(data.getFullAddress()); 
     Picasso.with(context).load(data.getCustomerPicture()).into(cusPic); 

    } 

    public void setBadgeColor(int drawable) { 
     this.Badge.setBackgroundResource(drawable); 
    } 

    public void setBadge(String badge) { 
     this.Badge.setText(badge); 
    } 


} 


@Override 

public int getSwipeLayoutResourceId(int position) { 

    return R.id.swipe; 
} 

@Override 
public void openItem(int position) { 

} 

@Override 
public void closeItem(int position) { 

} 

@Override 
public void closeAllExcept(SwipeLayout layout) { 

} 

@Override 
public void closeAllItems() { 

} 

@Override 
public List<Integer> getOpenItems() { 
    return null; 
} 

@Override 
public List<SwipeLayout> getOpenLayouts() { 
    return null; 
} 

@Override 
public void removeShownLayouts(SwipeLayout layout) { 

} 

@Override 
public boolean isOpen(int position) { 
    return false; 
} 

@Override 
public Attributes.Mode getMode() { 
    return null; 
} 

@Override 
public void setMode(Attributes.Mode mode) { 

} 


    } 

我NewOrder片段

注意:FinishedOrders選項卡(片段)與新訂單執行的操作相同,但是會過濾當前的Finished狀態。

public class NewOrdersTab extends Fragment { 

RecyclerView recyclerView; 
OrdersDataAdapter adapter; 
private SwipeRefreshLayout swiperefresh; 
private TextView emptyView; 
ArrayList<OrderPresenter> modelData; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    final View rootView = inflater.inflate(R.layout.new_orders_tab_frag, container, false); 

    modelData = new ArrayList<>(); 
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); 
    swiperefresh = (SwipeRefreshLayout) rootView.findViewById(R.id.swiperefresh); 

    recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity())); 
    swiperefresh.setColorSchemeResources(R.color.colorPrimary, R.color.color_error, R.color.colorInfo); 
    adapter = new OrdersDataAdapter(modelData, getActivity()); 
    emptyView = (TextView) rootView.findViewById(R.id.empty_view); 

    recyclerView.setAdapter(adapter); 
    adapter.setMode(Attributes.Mode.Single); 

    OrderRepository.fetchOrders("awaiting-shipment", getActivity(), new DataFetch() { 
     @Override 
     public void onResponse(ArrayList<OrderPresenter> data) { 
      swiperefresh.setRefreshing(true); 

      if (data.size() != 0) { 
       swiperefresh.setRefreshing(true); 

       emptyView.setVisibility(View.GONE); 
       modelData.clear(); 
       modelData.addAll(data); 
       adapter.notifyDataSetChanged(); 

      } else { 

       emptyView.setVisibility(View.VISIBLE); 
       emptyView.setText(getString(R.string.No_New_Orders)); 
      } 
      swiperefresh.setRefreshing(false); 

     } 
    }); 

    return rootView; 
} 

    } 
+1

我會嘗試更改適配器內的數據。它爲我工作 –

+0

@LongLuong是怎麼回事? –

回答

1

我想通了,我只是說這兩條線後,我提出的要求..!

orders.remove(position); 
notifyItemRemoved(position); 
//notifyDataSetChanged(position); 
+0

你解決了嗎? –

+0

@LongLuong是的,用這兩行 –

+1

很酷!那麼你應該把你的答案標記爲「正確」。 –