Android的ListFragment更新/刷新和onItemClick [英] Android ListFragment update/refresh and onItemClick

查看:290
本文介绍了Android的ListFragment更新/刷新和onItemClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在从来就我的Andr​​oid项目的一个问题。一个汇入作业音乐曲目播放器,它显示了ListFragment每个轨道。每个项目得到了一个位图,其中的示波器位图画布上绘制。
在Listfragment的项目被定期刷新。这是通过完成
notifyDataSetChanged();

我也想静音一条轨道,当我点击该项目,但onItemClick事件doesn't被解雇每次。只是有时。谁能解释这样对我?我在做什么错在这里?
它的工作原理完美无notifyDataSetChanged(),但随后的项目不刷新。

谢谢!

这是全code:

Mainactivity:

 包de.sma.stackoverflow;进口android.app.Activity;
进口android.os.Bundle;公共类MainActivity扩展活动
{
    @覆盖
    保护无效的onCreate(捆绑savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
    }
}

MyListFragment

 包de.sma.stackoverflow;进口的java.util.ArrayList;
进口的java.util.List;
进口了java.util.Random;进口android.app.ListFragment;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Paint;
进口android.os.Bundle;
进口android.os.Handler;
进口android.util.Log;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;公共类MyListFragment扩展ListFragment实现OnItemClickListener
{
    ListViewAdapter适配器;
    私人列表< ListViewItem的> rowItems;
    私人处理程序sampleUpdateHandler =新的处理程序();
    涂料paintText =新的油漆(Paint.ANTI_ALIAS_FLAG);
    布尔bMuted = FALSE;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState)
    {        返回inflater.inflate(R.layout.fragment_list_layout,空,假);
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);        paintText.setColor(Color.WHITE);
        paintText.setStyle(Paint.Style.FILL);        rowItems =新的ArrayList< ListViewItem的>();
        rowItems.add(新的ListViewItem(机器人));
        rowItems.add(新的ListViewItem(iOS版));
        rowItems.add(新的ListViewItem(塞班));
        rowItems.add(新的ListViewItem(黑莓));
        rowItems.add(新的ListViewItem(Windows手机));
        rowItems.add(新的ListViewItem(Galaxy Nexus的));
        rowItems.add(新的ListViewItem(离线));        适配器=新ListViewAdapter(getActivity(),rowItems);
        setListAdapter(适配器);
        getListView()setOnItemClickListener(本)。
        StartThread();
    }    @覆盖
    公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的ID)
    {
        Log.d(WhyDoesntThisWork,onListItemClick);
        !bMuted = bMuted;
    }
    私人无效StartThread()
    {
        新主题(新的Runnable()
        {
            随机兰特=新的随机();            公众诠释randInt(INT分钟,INT最大值)
            {
                INT randomNum = rand.nextInt((最大 - 最小)+ 1)+分钟;
                返回randomNum;
            }            @覆盖
            公共无效的run()
            {
                而(真)
                {
                    尝试
                    {
                        视频下载(10);
                        sampleUpdateHandler.post(新的Runnable()
                        {
                            @覆盖
                            公共无效的run()
                            {
                                画布myCanvas = rowItems.get(0).getCanvas();
                                如果(bMuted)
                                    myCanvas.drawColor(0xFFFF0000地址);
                                其他
                                    myCanvas.drawColor(0xFF000020);
                                的for(int i = 0; I< myCanvas.getWidth();我++)
                                    myCanvas.drawLine(ⅰ,randInt(0,50)中,i + 1,randInt(0,50),paintText);                                adapter.notifyDataSetChanged();
                            }
                        });
                    }赶上(InterruptedException的E)
                    {
                        e.printStackTrace();
                    }
                }
            }
        })。开始();
    }
}

ListViewItem的:

 包de.sma.stackoverflow;进口android.graphics.Bitmap;
进口android.graphics.Canvas;
进口android.widget.ImageView;公共类的ListViewItem
{    私人字符串称号;
    私人位图mBitmap;
    私人帆布mCanvas;
    私人ImageView的mImageView;    公众的ListViewItem(字符串名称)
    {
        this.title =称号;
        mBitmap = Bitmap.createBitmap(100,50,Bitmap.Config.RGB_565);
        mCanvas =新的Canvas(mBitmap);
        mCanvas.drawColor(0xFF2020FF);
    }    公共帆布getCanvas()
    {
        返回mCanvas;
    }    公共字符串的getTitle()
    {
        返回称号;
    }    公共位图getBitmap()
    {
        返回mBitmap;
    }    公共无效setImageView(ImageView的ImageView的)
    {
        this.mImageView = ImageView的;
    }
}

ListViewAdapter:

 包de.sma.stackoverflow;进口android.app.Activity;
进口android.content.Context;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.ImageView;
进口android.widget.TextView;
进口的java.util.List;公共类ListViewAdapter延伸BaseAdapter
{
    上下文语境;
    清单< ListViewItem的> rowItem;    ListViewAdapter(上下文的背景下,列表与LT; ListViewItem的> rowItem)
    {
        this.context =背景;
        this.rowItem = rowItem;
    }    @覆盖
    公众诠释getCount将()
    {
        返回rowItem.size();
    }    @覆盖
    公共对象的getItem(INT位置)
    {
        返回rowItem.get(位置);
    }    @覆盖
    众长getItemId(INT位置)
    {
        返回rowItem.indexOf(的getItem(位置));
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup)
    {        如果(convertView == NULL)
        {
            LayoutInflater mInflater =(LayoutInflater)上下文
                    .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(位置);
        //设置图像资源和标题
        txtTitle.setText(row_pos.getTitle());        ImageView的ImageView的=(ImageView的)convertView.findViewById(R.id.icon);
        imageView.setImageBitmap(row_pos.getBitmap());
        row_pos.setImageView(ImageView的);        返回convertView;
    }
}

主要布局:

 <?XML版本=1.0编码=UTF-8&GT?;
<的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>    <片段
        机器人:ID =@ + ID /片段1
        机器人:名字=de.sma.stackoverflow.MyListFragment
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent/>< / LinearLayout中>

列表布局:

 <?XML版本=1.0编码=UTF-8&GT?;
<的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>    < ListView控件
        机器人:ID =@机器人:ID /列表
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT>
    < /&的ListView GT;    <的TextView
        机器人:ID =@机器人:ID /空
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT>
    < / TextView的>
< / LinearLayout中>

列表项:

 <?XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =50dp
    机器人:填充=5DP>    < ImageView的
        机器人:ID =@ + ID /图标
        机器人:layout_width =100dp
        机器人:layout_height =50dp
        机器人:layout_alignParentLeft =真
        机器人:layout_marginLeft =12dp
        机器人:layout_marginRight =12dp
        机器人:contentDescription =imgdesc
        机器人:layout_alignParentTop =真/>    <的TextView
        机器人:ID =@ + ID /标题
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =match_parent
        机器人:layout_marginTop =10dp
        机器人:layout_toRightOf =@ ID /图标
        机器人:重力=center_vertical
        机器人:文字颜色=#000000
        机器人:TEXTSIZE =20SP
        机器人:文字=测试/>
< / RelativeLayout的>


解决方案

一切都在你的codeS,不是一个项目的主要原因精点击是因为你使用了​​,而(真)声明这是总是如此。目前正在线程内处理的项目不会被点击,这是目前由螺纹中排除的项目正在被点击。无论你有多必须让你的线程不循环的内部运行。所以,什么你能做的就是要么删除你的,而(真)语句,或更换与如果(真实)

I´ve a problem in my Android Project. It´s a music track player, which shows each track in a ListFragment. Every item has got a Bitmap, where an oscilloscope is drawn on the bitmaps canvas. The items in the Listfragment are refreshed periodically. This is done via notifyDataSetChanged();

I also want to mute one track when I click on the item, but the onItemClick event doesn´t get fired every time. Only sometimes. Can anyone explain this to me? What am I doing wrong here? It works perfect without notifyDataSetChanged(), but then the items are not refreshed.

Thanks!

This is the full code:

Mainactivity:

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);
    }
}

MyListFragment

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();
    }
}

ListViewItem:

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;
    }
}

ListViewAdapter:

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;
    }
}

Main Layout:

<?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>

List layout:

<?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>

List item:

<?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>

解决方案

Everything is fine in your codes, Main reason of not being an item clicked is because of you have used while (true) Statement which is always true. The item which is currently being processed inside the thread will not be clicked and the items which are currently excluded from thread is being clickable. How ever you have to make your thread not to run inside loop. So that what you can do is either remove your while(true) statement, OR replace that with if(true).

这篇关于Android的ListFragment更新/刷新和onItemClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆