从列表视图的自定义适配器内的意图服务接收结果

Posted

技术标签:

【中文标题】从列表视图的自定义适配器内的意图服务接收结果【英文标题】:receiving result from intent service inside custom adapter for listview 【发布时间】:2017-01-09 20:00:56 【问题描述】:

我想要做的是以下

    我的自定义适配器布局中有一个按钮,可以与服务器上的 php 脚本交互以在服务器上下载文件 下载过程通过在后台调用 IntentService 来处理 服务完成后,我想更新在活动中启动的列表视图 我被Receiver 类卡住了

到目前为止我的代码如下:

 @Override
public View getView(int position, View convertView, ViewGroup parent) 
    View view = convertView;
    if (view == null) 
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        if(IsRepository)
            view = vi.inflate(R.layout.filerepositorylayout, null);
        
     
      BindLayoutElemnts(view, position);
    return view;
  

这里是调用 Intent 服务的地方:

 private void BindLayoutElemnts(View view, int position) 
      myFiles = (files) getItem(position);
       img_Download.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            Intent intent = new Intent(getContext(),DownloadService.class);
            intent.putExtra("FileID",""+myFiles.getID());
            intent.putExtra("FileName",myFiles.getName());
            context.startService(intent);
        
    );
 

调用活动

这里是 Receiver 被调用的地方

    public class user_repositry extends AppCompatActivity implements  DownloadReceiver.Receiver 
 protected void onCreate(Bundle savedInstanceState) 
       super.onCreate(savedInstanceState);
       myDownloadReceiver = new DownloadReceiver(new Handler());
       myDownloadReceiver.setReceiver(this);
 

  @Override
public void onReceiveResult(int resultCode, Bundle resultData) 
    Toast.makeText(user_repositry.this, "Downloaded", Toast.LENGTH_SHORT).show();


Intent service 代码:

 ResultReceiver rec;
 @Override
protected void onHandleIntent(Intent intent) 
      rec = intent.getParcelableExtra("DownloadReceiver");


 private void UpdateDBRecord() 
    HashMap<String, String>  PostData=new HashMap<String, String>();
    PostData.put("call","UpdateFile");
    PostData.put("ID", ""+file_ID);
    BackgroundWorker registerWorker= new BackgroundWorker(this,this,PostData);
    registerWorker.setShowLoadingMessage(false);
    registerWorker.execute(Helper.getPhpHelperUrl());

这个函数就是上面registerWorkerPost execute调用的函数

 @Override
public void processFinish(String results) 
    Log.d("Download","Download DB updated");
    Bundle bundle = new Bundle();
    //bundle.putString("resultValue", "My Result Value. Passed in: " );
    // Here we call send passing a resultCode and the bundle of extras
    rec.send(Activity.RESULT_OK, bundle);

我现在被这个错误困住了:

Failed resolution of: Lcom/bassem/donateme/classes/DownloadReceiver;

我知道接收器没有被启动,但我似乎无法在我的逻辑中找到丢失的代码

感谢您的帮助

【问题讨论】:

请提供DownloadReceiver的完整代码以及错误的全文。如果您检查Java Code Convention 并按照此约定修复您的代码,以便人们可以轻松阅读您的代码,这也将非常有帮助。 “解析失败”本身并不是错误消息,这可能是 NoClassDefFoundError,并且完整的错误消息包含更多信息,例如发生错误的行号。您的所有课程都属于同一个项目吗? 【参考方案1】:

试试这个,

第 1 步: 在 Activity 中使用 ResultReceiver 创建结果处理程序

public ResultReceiver downloadReceiver = new ResultReceiver(new Handler()) 
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) 
        super.onReceiveResult(resultCode, resultData);
        //Broadcast /send the result code in intent service based on your logic(success/error) handle with switch
        switch (resultCode) 
            case 1: 
                //Get the resultData and do your logic here
                //Update your list view item here
                break;
            
            case 2: 
                //Get the resultData and do your logic here
                //Update your list view item here
                break;
            
        
    
;  

第 2 步:将结果处理程序放入 Intent 中并启动 Intent 服务

Intent intent = new Intent(getContext(), DownloadService.class);
intent.putExtra("receiver",downloadReceiver);

第 3 步:在服务类中处理意图(获取结果处理程序的值)

final ResultReceiver receiver;

@Override
protected void onHandleIntent(Intent intent) 
    receiver = intent.getParcelableExtra("receiver");

第 4 步:将数据发送/广播到结果处理程序

//based on your logic, change the result code and data

//Add your result data (success scenario)
Bundle bundle = new Bundle();
bundle.putString("result","Some text");
receiver.send(1,bundle);

//Add your result data (failure scenario)
receiver.send(0,bundle);

【讨论】:

【参考方案2】:

缺少的代码不在您的逻辑中,而是在 DownloadReciever 的逻辑中。更广泛地寻找错误并找出为什么没有加载。那或从中发布一些代码以便可以回答。例如,是否正在寻找一个不存在并因此崩溃的 uri?它期待什么,失败了,为什么失败了。您没有发布任何崩溃的代码。您发布了调用崩溃的代码。

【讨论】:

以上是关于从列表视图的自定义适配器内的意图服务接收结果的主要内容,如果未能解决你的问题,请参考以下文章

使用适用于 Android 应用的自定义适配器将项目动态添加到列表视图

如何使用来自另一个活动的自定义适配器更新列表视图?

使用带有文本和图像的自定义适配器在列表视图中搜索

如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?

如何使用 glide* 使用数组列表中的自定义适配器将图像设置为列表视图

无法从android中的自定义列表视图中获取所选项目