私は本当にあなたの助けが必要です。まず、SherlockListFragmentから拡張するCustomfragmentを作成しました。独自のListviewrowデザインを実装したため、独自のBaseAdapterを作成しました。リストビューの行には、チェックボックスといくつかのテキストビューが含まれています。私の目標は、Gmailアプリのように見えて相互作用するリストビューを作成することでした。つまり、ユーザーがチェックボックスをクリックすると、アクションのコンテキストメニューがアクティブになります。
だからこれらは私のクラスです:
public class PurchasesOpenFragment extends SherlockListFragment implements
OnItemClickListener, ListViewContextualMenuListener {
private ActionMode actionMode;
ArrayList<String> purchases = new ArrayList<String>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
purchases.add("Temp 1");
purchases.add("Temp 5");
purchases.add("Temp 2");
purchases.add("Temp 3");
purchases.add("Temp 4");
purchases.add("Temp 6");
purchases.add("Temp 7");
PurchaseOpenAdapter purchaseAdapter = new PurchaseOpenAdapter(
getActivity().getBaseContext(), purchases);
setListAdapter(purchaseAdapter);
purchaseAdapter.setOnListViewContextualMenuListener(this);
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast toast = Toast.makeText(getActivity(),
"Show details of element with id: " +arg3,Toast.LENGTH_SHORT);
toast.show();
}
private final class ModeCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Create the menu from the xml file
MenuInflater inflater = getSherlockActivity()
.getSupportMenuInflater();
inflater.inflate(R.menu.context_test, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// Here, you can checked selected items to adapt available actions
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// Destroying action mode, let's unselect all items
for (int i = 0; i < getListView().getAdapter().getCount(); i++)
getListView().setItemChecked(i, false);
if (mode == actionMode) {
actionMode = null;
}
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
long[] selected = getListView().getCheckedItemIds();
Toast toast = Toast.makeText(getActivity(), "elements selected: "
+ selected.length, Toast.LENGTH_SHORT);
toast.show();
if (selected.length > 0) {
for (long id : selected) {
toast = Toast.makeText(getActivity(), "element selected with id: " + id,
Toast.LENGTH_SHORT);
toast.show();
}
}
mode.finish();
return true;
}
};
public void closeContextualMenu() {
if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
}
/**
*
*/
@Override
public void onItemCheckBoxChanged(int position, boolean checkState) {
Toast toast = Toast.makeText(getActivity(), "pos: " + position
+ " check: " + checkState, Toast.LENGTH_SHORT);
toast.show();
getListView().setItemChecked(position, checkState);
int amountOfCheckedElements = getListView().getCheckedItemIds().length;
if (amountOfCheckedElements > 0) {
if (actionMode == null) {
actionMode = getSherlockActivity().startActionMode(
new ModeCallback());
}
actionMode.setTitle(amountOfCheckedElements + " selected");
return;
} else {
if (actionMode != null) {
actionMode.finish();
}
}
}
}
2等:
パブリッククラスPurchaseOpenAdapterはBaseAdapterを拡張し、OnClickListenerを実装します{
private Context context;
private ArrayList<String> purchases;
private static LayoutInflater inflator;
private ListViewContextualMenuListener contextualListener;
public PurchaseOpenAdapter(Context context, ArrayList<String> purchases) {
this.context = context;
this.purchases = purchases;
inflator = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return purchases.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
boolean checkBoxChanged = false;
if (convertView == null) {
convertView = inflator
.inflate(R.layout.listview_row, parent, false);
holder = new ViewHolder();
holder.tvDate = (TextView) convertView
.findViewById(R.id.listview_purchase_date);
holder.tvTitle = (TextView) convertView
.findViewById(R.id.listview_purchase_title);
holder.tvSupermarket = (TextView) convertView
.findViewById(R.id.listview_supermarket);
holder.tvArticleAmount = (TextView) convertView
.findViewById(R.id.listview_article_amount);
holder.checkBox = (CheckBox) convertView
.findViewById(R.id.listview_checkbox);
holder.checkBox.setTag(position);
holder.checkBox.setOnClickListener(this);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// TODO only temp data
String temp = purchases.get(position);
holder.tvDate.setText("01.01.2001");
holder.tvTitle.setText(temp);
holder.tvSupermarket.setText("Spar");
holder.tvArticleAmount.setText("20 Articles");
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
public void setOnListViewContextualMenuListener(
ListViewContextualMenuListener l) {
contextualListener = l;
}
@Override
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
Toast toast = Toast
.makeText(context, "Checkboxstate of element with positon: "
+ v.getTag() + " check state: " + cb.isChecked(),
Toast.LENGTH_SHORT);
toast.show();
contextualListener.onItemCheckBoxChanged(Integer
.parseInt(cb.getTag().toString()),
cb.isChecked());
}
static class ViewHolder {
TextView tvDate;
TextView tvTitle;
TextView tvSupermarket;
TextView tvArticleAmount;
CheckBox checkBox;
}
}
ここでわかるように、PurchaseOpenAdapterのチェックボックスにOnClickMethodを実装しました。チェックボックスの状態が変更されたことをPurchaseOpenFragmentに通知するために、独自のリスナー(onItemCheckBoxChanged)を作成しました。
ここで、問題の説明に移ります。チェックボックスをクリックすると、コンテキストメニューが表示されますが、チェックボックスはオンになりませんが、チェックボックスの状態をチェックすると、すべて問題ありません(idとisChecked()は正しい)。
コンテキストメニューを閉じると、チェックボックスがオンになっています。
同じチェックボックスをもう一度クリックすると、IDが完全に間違っています。アダプタクラスでリスナーの実行を削除すると、チェックボックスが正しく機能します。
うまくいけば、誰かが私を助けることができます。たぶん、listfragmentクラスに通知する別の方法があります。前もって感謝します!
私は新規ユーザーですので、写真を投稿することはできませんが、必要に応じてメールで送ることができます。