2

ListViewの行をクリックして、その行に表示されているものを使用して基本的な編集を行うためのボタンを提供する効果が欲しいのですが。今、私はテキストビューを編集可能なテキストビューに正確に変更することを意味するのではなく、たとえば「編集」や「削除」などのボタンを提供するだけのものです。これはポップアップで行うことができますが、これを避けようとしています。これらのアクションボタンを、その行の表示されたコンテンツに置き換えたいと思います。

最初、私はそれが列に膨らむための2つのレイアウトを持つことができると思いました。1つは「アクティブ」でもう1つは通常です。クリックすると、クリックされた行の異なるレイアウトが返され、現在選択されている行を示すマーカーが表示されます。リストビューが上下にスクロールされるときに、膨らんだビューがリサイクルされるという、私が予期していなかった問題に最初に遭遇しました。いいでしょう、それで私はBaseAdapterの拡張を作成して、getView()で自分のことをできるようにしました。さて、私はそれを正しくリサイクルできるようにすることができました(そしてそれが想定されていなかった「アクティブな」ビューを再利用しませんでした)しかし上記の行を画面からスクロールしてから元に戻す場合を除いて、代替レイアウトを更新/再読み込みする方法がわかりません。行が画面を離れて戻ってこない限り、getView()を実際に発生させる方法はないようです。

つまり、これは2つの問題です。1つは、表示中に1行で膨らんだビューを入れ替える方法はありますか?そして、おそらくこれを行う私の方法は、私が望むことを達成するための逆方向の方法であり、より良い方法はありますか?お時間をいただきありがとうございます!

public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    Boolean activeExists = false;
    if(convertView!=null && convertView.getTag()==(String) "active"){
        activeExists=true; }
    if (((position==activeFlag && activeExists==true) || (position!=activeFlag && activeExists==false)) && convertView!=null) {
        v = convertView;
    } else if(position==activeFlag && activeExists==false){
        v = inflater.inflate(rowlayoutActive, parent, false);
        v.setTag((String) "active");
    } else if (position!=activeFlag && activeExists==true) {
        v = inflater.inflate(rowlayout, parent, false);
    } else {
        v = inflater.inflate(rowlayout, parent, false);
    }
    bindView(position, v);
    return v;
}

(このgetViewの外で(int) activeFlag、現在「選択されている」ものを覚えておく必要があります。また、bindViewの独自のバージョンがあり、通常とそれほど違いはありません。ブール値は、間違った状態を維持するために、すでに膨らんだビューのクイックマークです。 1つは、リサイクル時に間違った行に移動することからです。)

4

1 に答える 1

1

すばらしい質問です。答えの一部は、MVCモデルを検討することかもしれません。厳密に言えば、基になるデータを変更してUIに変更を加える必要があります。これは、データ「isEditing」などにブール値を追加することを提案し、クリックして設定し、notifyDataSetChangedを呼び出します。getViewでは、適切なレイアウトを使用するためにそのブール値をテストします。

于 2012-11-08T23:15:18.977 に答える