Обновить TextView в пользовательском ListView - PullRequest
3 голосов
/ 07 октября 2011

Я пытаюсь обновить TextView в пользовательском ListView через заданный интервал времени, например, TextView будет обновляться каждые 200 мс, однако я не могу понять, как это сделать.Внутренне объект обновляется номером, и я хотел бы показать, что в текстовом представлении mTitleText, однако, как показывает приведенный ниже код, в настоящий момент я могу достичь его только тогда, когда пользователь нажимает кнопку.

public class ListAdapter extends BaseAdapter {
private ArrayList< Object > mObjects;
private int mNumObjs = 0;

private LayoutInflater mLayoutInflater;
private Context mContext;

public ListAdapter ( Context context, ArrayList< Object > objects ) {
    mObjects;= objects;
    mLayoutInflater = LayoutInflater.from(context);
    mContext = context;
}

public int getCount() {
    return mObjects;.size();
}

public Object getItem( int position ) {
    return mObjects;.get(position);
}

public long getItemId( int position ) {
    return position;
}

public void addObject( Object obj) {
    obj.setId(mNumObjs);
    mObjects.add( obj );
    (mNumObjs);++;
    notifyDataSetChanged();
}

public void deleteObject( int pos ) {
    mObjects;.remove( pos );
    notifyDataSetChanged();
}

public View getView( final int position, View convertView, ViewGroup parent ) {
    final TimerView holder;

    if( convertView == null ) {
        convertView = mLayoutInflater.inflate( R.layout.customlistview, null );

        holder = new HolderView();
        holder.mListPosition = position;
        holder.mDeleteButton = (Button)convertView.findViewById(R.id.Delete);
        holder.mDeleteButton.setText( "Button No: " + position );
        holder.mDeleteButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                deleteObject(holder.mListPosition);
            }
        });

        holder.mButton = (Button)convertView.findViewById(R.id.Button);
        holder.mButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Object obj = mObjects.get(holder.mListPosition);

                mTitleText.setText(obj.getNum());
            }
        });

        convertView.setTag(holder);
    }
    else {
        holder = (TimerView) convertView.getTag();
    }
    holder.mListPosition = position;
    holder.mDeleteButton.setText( "Button No: " + position );

    return convertView;
}

class HolderView{
    int mListPosition;
    Button mDeleteButton;
    Button mButton;

    TextView mTitleText;
}
}

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Хорошо, мне удалось выяснить это самому, если ваши обновления не должны быть очень частыми (> 1 секунды), вы можете использовать notifyDataSetChanged (), однако, если вы, как и я, вам нужно постоянно обновлять просмотр списка каждые 200 мс или около того, вынужно перебрать видимые объекты в представлении списка и обновить его.

private Runnable showUpdate = new Runnable(){
    public void run(){
        mAdapter.updateList();
        //mAdapter.notifyDataSetChanged();
        int count = mListView.getCount();

        for( int i = 0; i < count; i ++ )
        {
            View convertView = mListView.getChildAt( i );

            if( convertView != null )
            {
                HolderView holder = (HolderView) convertView.getTag();

                Object obj = (Object)mAdapter.getItem( holder.mListPosition );

                holder.mTitleText.setText( obj.getText() );
            }
        }
    }
};

Thread mThread = new Thread()
{
    @Override
    public void run() {
       try {
            while(true) {
                sleep(100);
                mHandler.post(showUpdate);

                //mHandler.sendEmptyMessage(MSG_UPDATE);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
0 голосов
/ 07 октября 2011

Обновите текст в вашем списке mObjects и позвоните notifyDataSetChanged() на свой адаптер.

...