Android ListFragment更新/刷新和onItemClick

2023-12-26

我的 Android 项目遇到问题。它是一个音乐曲目播放器,显示 ListFragment 中的每个曲目。每个项目都有一个位图,其中示波器绘制在位图画布上。 Listfragment 中的项目会定期刷新。这是通过以下方式完成的 通知数据集更改();

我还想在单击该项目时将一个轨道静音,但 onItemClick 事件不会每次都被触发。只是有时。谁能向我解释一下吗?我在这里做错了什么? 它在没有notifyDataSetChanged()的情况下完美工作,但随后项目不会刷新。

Thanks!

这是完整的代码:

主要活动:

package de.sma.stackoverflow;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

我的列表片段

package de.sma.stackoverflow;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.app.ListFragment;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

public class MyListFragment extends ListFragment implements OnItemClickListener
{
    ListViewAdapter adapter;
    private List<ListViewItem> rowItems;
    private Handler sampleUpdateHandler = new Handler();
    Paint paintText = new Paint(Paint.ANTI_ALIAS_FLAG);
    boolean bMuted = false;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {

        return inflater.inflate(R.layout.fragment_list_layout, null, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        paintText.setColor(Color.WHITE);
        paintText.setStyle(Paint.Style.FILL);

        rowItems = new ArrayList<ListViewItem>();
        rowItems.add(new ListViewItem("Android"));
        rowItems.add(new ListViewItem("iOS"));
        rowItems.add(new ListViewItem("Symbian"));
        rowItems.add(new ListViewItem("Blackberry"));
        rowItems.add(new ListViewItem("Windows Phone"));
        rowItems.add(new ListViewItem("Galaxy Nexus"));
        rowItems.add(new ListViewItem("Offline"));

        adapter = new ListViewAdapter(getActivity(), rowItems);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
        StartThread();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        Log.d("WhyDoesntThisWork", "onListItemClick");
        bMuted = !bMuted;
    }


    private void StartThread()
    {
        new Thread(new Runnable()
        {
            Random rand = new Random();

            public int randInt(int min, int max)
            {
                int randomNum = rand.nextInt((max - min) + 1) + min;
                return randomNum;
            }

            @Override
            public void run()
            {
                while (true)
                {
                    try
                    {
                        Thread.sleep(10);
                        sampleUpdateHandler.post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                Canvas myCanvas = rowItems.get(0).getCanvas();
                                if (bMuted)
                                    myCanvas.drawColor(0xFFFF0000);
                                else
                                    myCanvas.drawColor(0xFF000020);
                                for (int i = 0; i < myCanvas.getWidth(); i++)
                                    myCanvas.drawLine(i, randInt(0, 50), i + 1, randInt(0, 50), paintText);

                                adapter.notifyDataSetChanged();
                            }
                        });
                    } catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

列表视图项:

package de.sma.stackoverflow;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.widget.ImageView;

public class ListViewItem
{

    private String title;
    private Bitmap mBitmap;
    private Canvas mCanvas;
    private ImageView mImageView;

    public ListViewItem(String title)
    {
        this.title = title;
        mBitmap = Bitmap.createBitmap(100, 50, Bitmap.Config.RGB_565);
        mCanvas = new Canvas(mBitmap);
        mCanvas.drawColor(0xFF2020FF);
    }

    public Canvas getCanvas()
    {
        return mCanvas;
    }

    public String getTitle()
    {
        return title;
    }

    public Bitmap getBitmap()
    {
        return mBitmap;
    }

    public void setImageView(ImageView imageView)
    {
        this.mImageView = imageView;
    }
}

列表视图适配器:

package de.sma.stackoverflow;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;

public class ListViewAdapter extends BaseAdapter
{
    Context context;
    List<ListViewItem> rowItem;

    ListViewAdapter(Context context, List<ListViewItem> rowItem)
    {
        this.context = context;
        this.rowItem = rowItem;
    }

    @Override
    public int getCount()
    {
        return rowItem.size();
    }

    @Override
    public Object getItem(int position)
    {
        return rowItem.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return rowItem.indexOf(getItem(position));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {

        if (convertView == null)
        {
            LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item, null);
        }

        TextView txtTitle = (TextView) convertView.findViewById(R.id.title);

        ListViewItem row_pos = rowItem.get(position);
        // setting the image resource and title
        txtTitle.setText(row_pos.getTitle());

        ImageView imageView = (ImageView) convertView.findViewById(R.id.icon);
        imageView.setImageBitmap(row_pos.getBitmap());
        row_pos.setImageView(imageView);

        return convertView;
    }
}

主要布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/fragment1"
        android:name="de.sma.stackoverflow.MyListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

列表布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </TextView>
</LinearLayout>

项目清单:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="imgdesc"
        android:layout_alignParentTop="true"/>

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/icon"
        android:gravity="center_vertical"
        android:textColor="#000000"
        android:textSize="20sp"
        android:text="test"/>
</RelativeLayout>

您的代码中的一切都很好,没有被点击的项目的主要原因是因为您使用了while (true)永远正确的陈述。当前正在线程内处理的项目将不会被单击,并且当前从线程中排除的项目是可单击的。你如何必须让你的线程不在循环内运行。所以你可以做的就是删除你的while(true)语句,或将其替换为if(true).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android ListFragment更新/刷新和onItemClick 的相关文章

  • ExtJS GridPanel 中的垂直滚动条

    我正在开发一个项目 其中页面上有一个 GridPanel 该面板可以显示任意数量的行 并且我设置了 autoHeight 属性 这会导致 GridPanel 扩展以适合行数 我现在想要一个水平滚动条 因为在某些分辨率下 并非所有列都会显示
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起
  • 使用和不使用 SciPy 计算 k 组合的数量

    我对这个函数感到困惑combSciPy 的 http docs scipy org doc scipy 0 14 0 reference generated scipy misc comb html看起来比简单的 Python 实现要慢 这
  • 反转默认比例梯度ggplot2

    我是新手 我正在尝试设计热图 这是我的代码 ggplot gd aes Qcountry Q6 1 Q6d order TRUE geom tile aes fill prob colour white theme minimal labs
  • Google 地图 v3 信息窗口在地图视口外打开

    如果单击地图视口顶部附近的标记 信息窗口将加载到可视区域之外 并且必须拖动地图才能查看信息窗口内容 理想情况下 我不希望地图自动平移 有没有办法以不同的方向加载信息窗口 例如如果标记位于视口的顶部 则以向下的方向显示信息窗口 不 你不能以不
  • Xcode 调试器显示错误的变量值

    我之前问过类似的问题here https stackoverflow com q 53092448 1187415 这个版本有更简单的例子 更新摘要 Xcode 在调试器变量部分中为每个字符串显示 FAIL Swift print 语句显示
  • Cassandra 中的数据分布

    我听说过 Cassandra 及其发行版 其实想知道数据在整个集群中是如何分布的现象 我的意思是 Cassandra 如何决定哪些节点拥有哪些数据 如果您了解 HashTable 数据结构以及 Hashtable 中如何进行哈希处理 那么这
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • travis-ci 安装程序使用 --github-token 发布

    我在使用带有 github 令牌的安装版本时遇到问题 我喜欢 travis ci 但我不愿意透露我的 github 密码 我需要使用令牌并且我阅读了文档 因为这应该可以通过这种方式实现 不幸的是它仍然要求输入密码 travis login
  • 如何对数字进行排序? [复制]

    这个问题在这里已经有答案了 下面是代码 Is the sortNumber对数字进行排序的函数 a 和 b 是什么意思以及为什么存在 为什么sortNumber in n sort sortNumber 没有指定任何参数a and b Ja
  • 如何设置打开文件时默认展开?

    In my vimrc我已经把set foldmethod syntax启用方法折叠等 但是 我不喜欢每次打开文件时都会折叠整个文件的默认设置 有没有办法启用foldmethod 但是当我打开文件时文件是否展开了 set foldlevel
  • 在实体框架中比较日期的最佳方法

    我在实体框架的 where 子句中使用日期并收到以下错误 这是由于以下代码 var entity dbContext MyTable Where w gt w PId 3 w CreatedOn Date mydate Date First
  • 带有客户端证书的android webview

    我尝试了几天使用嵌入在应用程序中的客户端证书的Web视图 但在我看来 android sdk没有提供任何方法来做到这一点 是否有回调来拦截服务器发送的质询 有没有办法将 webview 与客户端证书一起使用并发出 https 请求 因为我也
  • django:url 标签 -> 如何使用变量作为 url_name?

    我有一个 django 视图 它声明了一个目标变量 target name of next view to call return render request template locals 我想在我的模板中使用这个目标变量 我尝试了以下
  • 从 Bigcommerce 的浏览器内存中删除注入的分析库?

    我们如何删除这个脚本注入器系统并清除内存中的函数 简报 最近 Bigcommerce 的不法分子以 监控 为幌子创建了一个分析注入器 JS 该注入器被锁定在全局变量中 他们在未经任何 OP 同意的情况下将其推广到所有 50 000 家前台商
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • JavaScript Uncaught ReferenceError:jQuery 未定义;未捕获的引用错误:$未定义[重复]

    这个问题在这里已经有答案了 这是我的小提琴http jsfiddle net 4vaxE 35 http jsfiddle net 4vaxE 35 它在我的小提琴中工作得很好 但是 当我将其转移到dreamweaver时 它无法工作 我在
  • 我可以使用 VBA 将密码“传递”到 Excel 中的外部数据库连接吗?

    我正在尝试使用 VBA 隐藏我在 Excel 工作表中设置的数据连接的密码 由于 Excel 以纯文本形式存储外部数据源的密码 因此我想让 VBA 调用表的刷新并提供密码 我录制了刷新表格并输入密码的宏 但令我沮丧的是 它似乎省略了密码部分
  • 当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生什么?

    我的直觉是 支持 SPDY 的浏览器会将其视为 SPDY 响应 然而 我能找到的最多的是 H2 响应将优雅地降级到 HTTP1 1 的保证 我正在考虑以面向 H2 的方式提供资产 多个请求 无域分片等 但我确实需要支持一些非 H2 浏览器

随机推荐