2

より大きなアクティビティ内にあるリストビューを作成しました (リストビューは画面の半分を占め、その上に入力/ボタンがあります)。このリストビューは、カスタム アダプターを使用して行ビューを描画します。

行ビューの内側にはボタンがあり、クリック/タップすると、アダプターではなく、アクティビティが処理する必要があります。ただし、アダプター クラス内での方法がわからないので、アクティビティを使用するように指示できます。これは OOP であるため、アダプターをセットアップするときに (親アクティビティをアダプターにハードコーディングするのではなく) 何らかの参照をアクティビティに渡す必要があると想定しています。

アクティビティとアダプターの間でデータセットを共有するという単純な問題がありました (アダプターにアクティビティの配列リストを使用させたかったのです) が、それも解決できなかったため、配列リストを複製としてアダプタ。だから私はクリックリスナーを解決したいと思っています。また、作成する必要がある重複データを取り除くことができるということですか?

すべてのコードは非常に単純ですが、大まかな概要は次のとおりです。

リスト アダプターの設定とデータセットの宣言 (これはアクティビティ データセットであり、アダプターではありません)

numbersListAdapter = new NumberListAdapter(this);
numbersList.setAdapter(numbersListAdapter);
this.selectedContacts = new HashMap<Long, HashMap<String, String>>();

アクティビティ データ セットへのエントリの追加とアダプタ データセットへの追加

HashMap<String, String> tempa = new HashMap<String,String>();
tempa.put("name", name);
tempa.put("number", number);
this.selectedContacts.put(contactID, tempa);

this.numbersListAdapter.addEntry(contactID, tempa);

アダプターはエントリーを追加します

public void addEntry(Long id, HashMap<String, String> entry) {  

        entry.put("contactID", id.toString());      

        this.selectedNumbers.add(entry);

        this.notifyDataSetChanged();

    }

アダプターのコンストラクター

public NumberListAdapter(Context context) {

        selectedNumbers = new ArrayList<HashMap<String, String>>();

        mInflater = LayoutInflater.from(context);

    }

注意:これは、このようなものに対する私の最初の試みです。私はAndroid、Java、およびOOプログラミングをほとんど行ったことがありません。したがって、コードが非効率的で非常にひどいものである可能性が高いことはすでにわかっています。しかし、私は何とか学ばなければなりません:)

編集

わかりましたので、少しばかげていることに気付きました。アダプターに渡されたコンテキストを使用して、親アクティビティを参照する必要がありました。しかし、私はまだそれを取得していません。コードは次のとおりです。

アダプターのコンストラクター

numbersListAdapter = new NumberListAdapter(this);

変数宣言とコンストラクター メソッド

public class NumberListAdapter extends BaseAdapter  {

    private LayoutInflater mInflater;

    private ArrayList<HashMap<String, String>> selectedNumbers;

    private Context parentActivity;



    public NumberListAdapter(Context context) {

        parentActivity = (Context) context; 

        selectedNumbers = new ArrayList<HashMap<String, String>>();

        mInflater = LayoutInflater.from(context);

    }

リスナー

Button theBtn = (Button)rowView.findViewById(R.id.actionRowBtn);
            theBtn.setOnClickListener(this.parentActivity);

Eclipse から 2 つのメッセージを受け取ります。最初のメッセージは、リスナーをコメント アウトしたときに発生します。 The value of the field NumberListAdapter.parentActivity is not used

リスナーを追加したら、取得します

The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the arguments (Context)

明らかに何か間違ったことをしています。おそらくまたかなりばかげた間違い

4

1 に答える 1

1

リストビューの行がクリックされたときにコールバックを取得する必要がある場合は、使用できます

numbersListAdapter.setOnitemitemClickLiistener

ただし、各行内のボタンをクリックする必要がある場合は、

アダプタの getView 関数を使用して、ボタンの onclicklistener を個別に設定します

編集:コンテキストをアクティビティに型キャストする

theBtn.setOnClickListener((YourActivity)this.parentActivity);
于 2012-08-17T18:55:44.733 に答える