0

アンドロイド 2.3.3

リストビューの更新に関して、stackoverflow でいくつかの質問を見ました。しかし、どれも私のために働いていませんでした。

動的リストビューがあり、その中にボタンがあります。データはデータベースから取り込まれており、リストビューの各行はカスタム レイアウトです。(クリア)ボタンを押すと、データベースがクリアされ(正常に動作します)、リストビューが更新されます(把握する部分)。

以下はコードです...

import java.util.ArrayList;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.mobilevoiceapps.advancedvoicecalculatorfree.R;

public class History extends ListActivity {

    ListView lvHistory;
    ArrayAdapter<String> adHistory;
    ArrayList<String> alHistoryCopy = new ArrayList<String>();
    String[] emptyList = { "Your Calculations History is Empty. Please Perform Some Calculations and visit again." };

    Database db;
    Cursor c;

    String expression = "";
    String result = "";

    boolean isEmpty = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        // setContentView(R.layout.history);

        lvHistory = getListView();
        final MyCustomAdapter myad = new MyCustomAdapter();

        db = new Database(this);
        c = db.retrieve_history();

        if (!((c.moveToFirst()) || c.equals(null) || c.getCount() == 0)) {

        } else if (c.getCount() > 0) {
            c.moveToFirst();
        }

        LayoutInflater header = getLayoutInflater();

        View header_View = header.inflate(R.layout.history_header, null);
        lvHistory.addHeaderView(header_View);

        View second_Header_View = header.inflate(
                R.layout.history_second_header, null);
        lvHistory.addHeaderView(second_Header_View);

        Button btnClearHistory = (Button) second_Header_View
                .findViewById(R.id.btnClearHistory);
        btnClearHistory.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                db.clear_history();
                myad.notifyDataSetChanged();
                lvHistory.invalidateViews();
                lvHistory.refreshDrawableState();
            }

        });

        lvHistory.setAdapter(myad);

    }

    class MyCustomAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return c.getCount();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            HistoryViewHolder viewHolder;

            if (convertView == null) {
                LayoutInflater li = getLayoutInflater();
                convertView = li.inflate(R.layout.history_row, null);

                viewHolder = new HistoryViewHolder();

                viewHolder.txtcnt = (TextView) convertView
                        .findViewById(R.id.txtView_History_Count);
                viewHolder.txtexp = (TextView) convertView
                        .findViewById(R.id.txtView_History_Expression);
                viewHolder.txtres = (TextView) convertView
                        .findViewById(R.id.txtView_History_Result);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (HistoryViewHolder) convertView.getTag();
            }

            viewHolder.txtcnt.setText(String.valueOf(position + 1));
            System.out.println("Position"
                    + viewHolder.txtcnt.getText().toString());

            c.moveToPosition(position);

            expression = c.getString(c.getColumnIndex("expression"));
            result = c.getString(c.getColumnIndex("result"));

            viewHolder.txtexp.setText(expression);
            System.out.println("Expression"
                    + viewHolder.txtexp.getText().toString());
            viewHolder.txtres.setText(result);
            System.out.println("Result"
                    + viewHolder.txtres.getText().toString());

            return convertView;
        }

        public class HistoryViewHolder {
            TextView txtcnt;
            TextView txtexp;
            TextView txtres;
        }

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

        if (db != null) {
            db.close();
        }

        if (c != null) {
            c.close();
        }
    }

}

編集:::スクリーンショット付き:::

ここに画像の説明を入力

ここに画像の説明を入力

4

5 に答える 5

0

活動を再開するだけです..

ActivityName.this.finish();
Intent intent=new Intent(this, ActivityName.class);
startActivity(intent);
于 2013-09-18T07:48:31.813 に答える
0

c = db.retrieve_history();の後に追加してみてくださいdb.clear_history();

@Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            db.clear_history();
            c = db.retrieve_history();
            myad.notifyDataSetChanged();
            lvHistory.invalidateViews();
            lvHistory.refreshDrawableState();
        }

これがお役に立てば幸いです。

于 2013-03-17T10:21:41.170 に答える
0

ListViewこれを試してください。使用して1つのアイテムを削除した後、更新する必要がありますmyad.notifyDataSetChanged();

  btnClearHistory.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

       YourActivity.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            myad.notifyDataSetChanged();
        }
    });
    }

});
于 2013-03-17T07:48:31.157 に答える
0

MyCustomAdapter を BaseAdapter から拡張し、notifyDataSetChanged を使用して ListView を更新してみてください。

データベース コンテンツを表示するより良い方法は、CursorAdapter (または CursorLoader) です。このようなアダプターは、更新通知をリッスンし、コンテンツを自動的に再読み込みします。

于 2013-03-17T07:49:44.910 に答える