实施RecyclerView并修改回收商项目

时间:2015-08-28 06:39:15

标签: java android service broadcastreceiver intentservice

我有一个使用RecyclerView的场景。每个回收商品都包含一个Upload按钮。上传的OnClick我正在进行网络操作(我将数据,图片音频和视频上传到服务器)。因此,在上传时,我想要显示Uploading DataUploading Images等消息。目前我的设计是这样的,

  1. 每个RecyclerItem都是卡片视图,我在ProgressBar中有TextViewLayout。正如我所说,我一个接一个地更改TextView内容。

    <LinearLayout
        android:id="@+id/progress_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <ProgressBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/update_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    
    <TextView
        android:id="@+id/first"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="5dp"/>
    
    <TextView
        android:id="@+id/second"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"/>
    
    <TextView
        android:id="@+id/third"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"/>
    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Upload"/>
     </LinearLayout> 
     </android.support.v7.widget.CardView>
    
  2.   

    上传所有内容是一个更大的过程,所以我有一个单独的   Thread课程在后台完成所有这些工作。

    1. 在RecyclerViewAdapter类中,我有更新UI的方法

      public void removeItem(String uniqueId) {
          if (recordMap != null && recordMap.keySet().size() > 0) {
              int pos = new ArrayList<>(recordMap.keySet()).indexOf(uniqueId);
              recordMap.remove(uniqueId);
              notifyItemRemoved(pos);
              notifyItemRangeChanged(pos, recordMap.keySet().size());
          }
      }
      
      public void failedItem(String uniqueId) {
          if (recordMap != null && recordMap.keySet().size() > 0) {
              int pos = new ArrayList<String>(recordMap.keySet()).indexOf(uniqueId);
              if (pos != -1) {
                  LayoutInflater mLayoutInflater = (LayoutInflater) mContext
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  View view = mLayoutInflater.inflate(
                      R.layout.template_cardview, null, false);
                  itemFailedFlag = true;
                  bindViewHolder(new ViewHolder(view), pos);
                  notifyItemChanged(pos);
              }
          }
      }
      
    2. 广播已在我Fragment的特定RecyclerView中注册(和取消注册),我将RecyclerViewAdapter对象传递给BroadcastReceiver类。

      @Override
      public void onResume() {
          super.onResume();
          if (mAdapter != null)
              mBroadcastReceiverClass = new BroadcastReceiverClass(mAdapter);
      
          if (mBroadcastReceiverClass != null)
              LocalBroadcastManager.getInstance(getActivity())
                  .registerReceiver(mBroadcastReceiverClass, filter);
      }
      
    3. 我在Thread课程中完成所有上传过程,一旦完成特定操作,我就会向已注册的广播接收器类广播消息。

      Intent mIntent = new Intent();
      mIntent.putExtra("uniqueId", uniqueId);
      mIntent.putExtra("fromFragment", "fragment_one");
      mIntent.setAction(context.getResources().getString(R.string.broadforcase));
      LocalBroadcastManager.getInstance(context).sendBroadcast(mIntent);
      
    4. OnRecieve Broadcast,使用传递的RecyclerViewAdapter对象,我调用Adapter类中定义的方法。

       @Override
      public void onReceive(Context context, Intent intent) {
      
          String fromFragment = intent.getStringExtra("fromFragment");
          String uniqueId= intent.getStringExtra("uniqueId");
          String successResult = intent.getStringExtra("result");
      
          if (fromFragment != null) {
              if (fromFragment.equals("fragment_one")) {
                  if (mAdapter != null) {
                     if (uniqueId!= null)
                         mAdapter.removeItem(uniqueId);
                     // Likewise call failedItem(uniqueId)
                  }
              } else if (fromFragment.equals("fragment_two")) {
                  if (mAdapter != null) {
                      mAdapter.notifyDataSetChanged();
                  }
              } else if (fromFragment.equals("fragment_three")) {
                  if (mAdapter != null) {
                      mAdapter.notifyDataSetChanged();
                 }
              }
          }
      }
      
    5.   

      另外请注意,上传过程不会阻止用户界面(例如ProgressDialog,它完全是后台进程)。因此,允许用户同时上传多个回收商品数据。

      在这里,一切都按预期工作。

      但我实施的方法是对的吗?或者这可以通过任何方式改进?

0 个答案:

没有答案