如何从适配器外部获取listview项的子视图

时间:2016-09-23 06:10:41

标签: java android listview android-intent

我想提前感谢你解决我的问题。

我的listview有一个自定义适配器。列表项有一个imageView(1),一个progressBar(3)和一个下载按钮(2)。

listitem

当点击每个列表项的下载按钮时,我抓住了列表项的重要细节,例如视图的位置,按钮的resourceid,imageview的资源ID和进度条的资源ID,然后我制作一个可以上课的对象"下载"。

Download download = new Download();
download.setUrl(url);
download.setButtonResource(this.downloadBt.getId());
download.setCreativeWork(creativeWork);
download.setDownloadBt(this.downloadBt);

download.setProgressBarResource(this.progressBar.getId());
download.setProgressBar(this.progressBar);
download.setContext(activity);
download.setViewResource(view.getId());

Intent intent = new Intent(activity, BroadcastService.class);
intent.putExtra("download", download);

Log.e("download button", url);

activity.startService(intent);

我启动了一项服务,可以进行下载并使用广播进行报告。收到此广播消息后,我想更新进度条。

我的问题是如何从接收消息的主要活动中获取有关的进度条。我该如何参考?

我目前正在使用一个parcelable对象来传递进度条的资源ID,从适配器到服务,然后使用intent的putExtra(),然后我传递给接收活动(mainActivity)在mainActivity

执行此操作
Download download = (Download)intent.getParcelableExtra("download");
ProgressBar progressBar = (ProgressBar)findViewById(download.getProgressBarResource());`

这里的问题是,无论单击哪个列表项,始终只返回列表的第一项。我想获得每个唯一的listitem并更新进度条和下载按钮。感谢

3 个答案:

答案 0 :(得分:1)

我假设您在😃ListView中显示此布局。首先需要做的是,在RecyclerView类中为index添加一个字段,以标识列表中按下该按钮的位置。接下来,将DownloadindexgetView()传递给创建onBindViewHolder()对象的函数,并将Download添加到对象中。

当您收到index广播任何更新的时间时,请确保包含Service值。现在,在您收到广播值的活动代码中,提取indexindex的值。现在,您可以编写类似的内容来更新列表中该视图的进度:

progress

答案 1 :(得分:0)

这可以是解决问题的方法之一

  1. 首先您需要将进度值传递给启动时可能为零的适配器。
  2. 为您的列表视图实施setOnItemClickListener

    listView.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                final int position, long id) {
           //now point to your item position and do your stuff here
        }
    });
    
  3. 当您收到下载进度广播时。只需通过使用包含下载进度值的新项目对以前的项目进行Nullification来更新ListView。

答案 2 :(得分:0)

不确定这是否是你要找的......

在你的适配器中。在下面做..(我从我的项目中取样,当点击删除按钮时,从列表中删除卡片)

在适配器内的getView函数中。

Card card = list.get(position);
viewHolder.imgDelete.setTag(card);// --> i set the whole card info to tag 

在适配器外面。

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        int id = v.getId();
        if (id == R.id.iv_delete_card) {

            //System.out.println("---> Card: " + tag);

            //delete card 
            Object tag = v.getTag();
            if (tag != null && tag instanceof Card) {
                promptDeleteCard((Card) tag);
            }

        }
    }