当服务启动时,adater中的Arraylist将重新设置种子



当用户复制内容时,我正试图让服务复制剪贴板中的文本。我将活动中的对象添加到用于recyclerview的adater中。当服务启动以将服务中的其他对象添加到adater时,出现了问题。在启动服务之前,Arraylist的大小是3,但后来它变成了"0"。。。是什么使得列表(arraylist(的大小为零??


public class WebPage extends AppCompatActivity {
webadapter adapter2=new webadapter();
Button buttonB,buttonF,buttonH,buttonM;
WebView webView;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_page);
RecyclerView recyclerView2=findViewById(R.id.recyclerview2);
for(int po = 0; po<3; po++) {
adapter2.plusitem(new data("sentences", po));
adapter2.notifyItemInserted(po);
Log.i("info",adapter2.list.size()+"");
}
Log.i("info",adapter2.list.size()+"A");
startService(new Intent(getApplicationContext(),clipservice.class));
}
}
```
```
public class clipservice extends Service {
webadapter adapter2=new webadapter();
ClipboardManager clipboardManager;
int sm=Mainpage.temporary.size();
IBinder B;
public clipservice() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
clipboardManager=(ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
ClipData clip = clipboardManager.getPrimaryClip();
ClipData.Item item = clip.getItemAt(0);
String stringitem= item.toString();
if(sm<20) {
Mainpage.temporary.add(sm, stringitem);
}
if(sm>=20){
sm=0;
}
if(sm<3){
adapter2.setitem(new data(stringitem, sm));
adapter2.notifyItemChanged(sm);
}else if(sm>=3){
adapter2.plusitem(new data(stringitem, sm));
adapter2.notifyItemInserted(sm);
}
sm++;
}
});
Log.i("info","service");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("info","finish");
}
}
public class webadapter extends RecyclerView.Adapter<webadapter.ViewHolder>  {
static int T=0;
ArrayList<data> list =new ArrayList<data>();
public ArrayList<data> setitem(data s){
Log.i("info",list.size()+"");
list.set(s.getNumber(),s);
return list;
}
}
I/info: 1
I/info: 2
I/info: 3
I/info: 3A
I/info: service
I/info: 0  <-like this...

更新

您正在服务中创建一个新适配器。这就是为什么当服务启动时,您的arraylist为零的原因。

应该在服务和活动之间创建一个通信,而不是使用适配器直接从服务更新recyclerview。

通过BroadcastReciever在服务和活动之间进行通信的示例

在您的构建中添加以下依赖项.gradle

implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

在您的服务中添加以下方法

private  void sendMessageToActivity(String msg) {
Intent intent = new Intent("Clipdata");
intent.putExtra("value", msg);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

在您的onPrimaryClickChanged((中

更换

adapter2.setitem(new data(stringitem, sm));
adapter2.notifyItemChanged(sm);

sendMessageToActivity(sm);

现在在您的活动中添加广播接收器。

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("value");
//HERE ADD VALUE TO THE LISTARRAY and then ADAPTER.NOTIFYDATASETCHANGED
}
};

在创建活动中,注册接收器

LocalBroadcastManager.getInstance(this).registerReceiver(
mMessageReceiver, new IntentFilter("Clipdata"));

不要忘记在活动中的onPause((上注销接收器

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mMessageReceiver);
}

最新更新