0

プロジェクトに存在するテキストビューを一定時間後に更新して更新し、画面/UIに変更を表示したい.デバッグごとに、テキストビューの値が変化しているが、変更が画面に表示されない/ui.これらは xml です。

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

    <LinearLayout
        android:id="@+id/wrapper"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/comment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dip"
            android:background="@drawable/bubble_yellow"
            android:paddingLeft="10dip"
            android:text="Hello bubbles!"
            android:textColor="@android:color/primary_text_light" />
    </LinearLayout>

</LinearLayout>

これはもう 1 つの xml です。

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

 <include
        layout="@layout/listitem_discuss" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

これはメインクラスです:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_discuss);
        random = new Random();
        ipsum = new LoremIpsum();

        lv = (ListView) findViewById(R.id.listView1);

        adapter = new DiscussArrayAdapter(getApplicationContext(), R.layout.listitem_discuss);

        lv.setAdapter(adapter);

        tv = (TextView)this.findViewById(R.id.comment);
        ll = (LinearLayout)findViewById(R.id.wrapper);

        addItems();
        ReduceTimeIteration();
    }

    public void ReduceTimeIteration() // checks after 2 minutes for any message to delete
    {

        try
        {
            final Handler m_handler = new Handler();
            m_handlerTask = new Runnable()
            {
                @Override 
                public void run() 
                {
                    String a = tv.getText().toString();
                    if(tv.getText() == "Hello bubbles!")
                    {
                                                   tv.setText("hi");                            
                    }
                    else{
                        tv.setText("hello");  // postInvalidate()
                        adapter.notifyDataSetChanged(); 
                    }
                    m_handler.postDelayed(m_handlerTask, 2000); 
                }
            };
            m_handlerTask.run();
        }
        catch(Exception e)
        {

        }
    }
    private String addItems() {
        String a = "Hello bubbles";
        adapter.add(new OneComment(true,a));
        return a;
    }

}

これは配列アダプター クラスです。

public class DiscussArrayAdapter extends ArrayAdapter<OneComment> {

    private TextView countryName;
    private List<OneComment> countries = new ArrayList<OneComment>();
    private LinearLayout wrapper;

    @Override
    public void add(OneComment object) {
        countries.add(object);
        super.add(object);
    }

    public DiscussArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public int getCount() {
        return this.countries.size();
    }

    public OneComment getItem(int index) {
        return this.countries.get(index);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.listitem_discuss, parent, false);
        }

        wrapper = (LinearLayout) row.findViewById(R.id.wrapper);

        OneComment coment = getItem(position);

        countryName = (TextView) row.findViewById(R.id.comment);

        countryName.setText(coment.comment);

        countryName.setBackgroundResource(coment.left ? R.drawable.bubble_yellow : R.drawable.bubble_green);
        wrapper.setGravity(coment.left ? Gravity.LEFT : Gravity.RIGHT);

        return row;
    }

    public Bitmap decodeToBitmap(byte[] decodedByte) {
        return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
    }

}

これは、アダプターにデータを渡すクラスです。

public class OneComment {
    public boolean left;
    public String comment;

    public OneComment(boolean left, String comment) {
        super();
        this.left = left;
        this.comment = comment;
    }
}

このプロジェクトでは、メイン クラスの textview tv の値を更新したいと考えています。値は実際には変化していますが、画面/UI に表示されません。助けてください。よろしくお願いします。

4

4 に答える 4

3

この方法を変更してみてください

private String addItems() {
        String a = "Hello bubbles";
        adapter.add(new OneComment(true,a));
        return a;
    }

private String addItems() {
        String a = "Hello bubbles";

        adapter.notifyDataSetChanged();

        adapter.add(new OneComment(true,a));

        adapter.notifyDataSetInvalidated();

        return a;
    }
于 2012-11-01T10:11:48.130 に答える
0

ReduceTimeIteration()でハンドラーを宣言しています。このメソッドは、ランナブルを実行するようにメッセージを送信してから終了します。ハンドラーはスコープ内にないため、破棄されます。クラスレベルでハンドラーを宣言します。

于 2012-11-01T10:00:30.807 に答える
0

LinearLayout の向きについては言及していません。デフォルトのLinearLayout向きはHorizontalですので、指定してくださいandroid:orientation="vertical"

于 2012-11-01T09:48:01.153 に答える
0

あなたが何を期待しているのか正確にはわかりませんが、ざっと見てみると、あなたRunnableは私には少し疑わしいようです. どちらの場合でもアダプターを更新できるように、 if/elsenotifyDataSetChanged条件の外で呼び出す必要があると思います。

Stringsまた、 を使用して 2 つを比較しないでください==を使用して比較する必要があります。equals()

        @Override 
        public void run() 
        {
            String a = tv.getText().toString();
            if(tv.getText().equals("Hello bubbles!"))
                tv.setText("hi");
            else
                tv.setText("hello");  // postInvalidate()

            adapter.notifyDataSetChanged();
            m_handler.postDelayed(m_handlerTask, 2000); 
        }
于 2012-11-01T09:48:53.637 に答える