ListViewの項目を強調表示する

申し訳ありませんが、私はこの質問がこのウェブサイト上で以前に尋ねられたことを知っていますが、率直に言って、私が見た解決策の結果はありませんでした。たとえば、この投稿:リストビューで選択したアイテムを強調表示するandroid は、ListViewにchoiceModeを設定するだけでよいことを示唆しています。私はこれを試してきましたが、全く動作しません。

私のコードでは、ListView(onListItemClick)のリスナーがあり、トリガーされるたびに、次のようなものがあります。 getListView().setItemChecked(position、true)私は私のListViewに添付しているXMLセレクタを持っている...


私はここに何かを逃していますか setItemChecked()はListViewのセレクタに影響しませんか?

0
@FunkTheMonk、リスト内の項目を「強調表示」するか、基本的に背景色を変更しようとしましたが、一度に1つの項目だけを「チェック」する必要があります。
追加された 著者 Alex Fu,
私はandroid:listSelectorのアイデアは、リストの選択(dpadを使ってリスト内を移動する)を扱うことだと思います。チェックされた行には影響しません。
追加された 著者 aromero,
行をクリックしてセレクタのグラフィックを表示させようとしていますか? (行の中の何かが独自のonClickListenerを持っていればそれはできません)
追加された 著者 FunkTheMonk,

1 答え

私は同様の問題を抱えており、コードで解決しました。これは、最も明るくない、または最も効率的なソリューションではないかもしれませんが、ListView描画の問題を回避し、今のところうまくいくようです。

アクティビティファイル:

private ListView listView;
private View selectedView;
private int selectedPosition;
private MyAdapter arrayAdapter;

...
// set a state machine for when a list item is clicked
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (selectedPosition == -1) {
               //no item is selected, mark as selected
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            } else if (selectedPosition == position) {
               //the same item is selected as the previous one, deselect
                selectedView = null;
                view.setBackgroundResource(R.drawable.bg_unselected);
                selectedPosition = -1;
            } else {
               //another item is selected, deselect the previous and select the new one
                selectedView.setBackgroundResource(R.drawable.bg_unselected);
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            }

            arrayAdapter.setSelectedPosition(selectedPosition);
        }
    });

アダプター・コード:

public class MyAdapter extends ArrayAdapter {
    private int selectedPosition;

    private static class ViewHolder {
        RelativeLayout layout;
        ...
    }

    public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.layout = (RelativeLayout) convertView.findViewById(R.id.rl_item);
            ...

            convertView.setTag(holder);
        }
        else
            holder = (ViewHolder) convertView.getTag();

        ...
        if (position == selectedPosition)
            holder.layout.setBackgroundResource(R.drawable.bg_selected);
        else
            holder.layout.setBackgroundResource(R.drawable.bg_unselected);
        ...

        return convertView;
     }

     ...
}

それが役に立てば幸い!

0
追加された