0

NewOrdersとFinishedOrdersという2つのタブ(フラグメント)があります。私はVolleyリクエストで注文を投入します。新しい注文タブの各アイテムはSwipeLayoutになりました。他のタブ(バックエンドのもの..)に移動して、これを完全に処理しました。アダプタから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

私は、要求を行った後、私はちょうどこの2行を追加し、それを考え出しました...!

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

あなたはそれを解決しましたか? –

+0

@LongLuongはい、これらの2本の線で –

+1

涼しい!答えを「正しい」とマークする必要があります。 –

関連する問題