我有一个使用RecyclerView
的场景。每个回收商品都包含一个Upload
按钮。上传的OnClick
我正在进行网络操作(我将数据,图片音频和视频上传到服务器)。因此,在上传时,我想要显示Uploading Data
,Uploading Images
等消息。目前我的设计是这样的,
每个RecyclerItem
都是卡片视图,我在ProgressBar
中有TextView
和Layout
。正如我所说,我一个接一个地更改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>
上传所有内容是一个更大的过程,所以我有一个单独的
Thread
课程在后台完成所有这些工作。
在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);
}
}
}
广播已在我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);
}
我在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);
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();
}
}
}
}
另外请注意,上传过程不会阻止用户界面(例如
ProgressDialog
,它完全是后台进程)。因此,允许用户同时上传多个回收商品数据。
在这里,一切都按预期工作。
但我实施的方法是对的吗?或者这可以通过任何方式改进?