Событие щелчка от Адаптера до Действия или Фрагмента в Android
Я настроил расширяемый список, отображаемый в Навигаторе. У меня есть прослушиватель щелчков в адаптере. Я хочу отправить событие щелчка из адаптера в мою активность или фрагмент.
Возможно ли это, если да, как мне это сделать?
Вот фрагмент моего адаптера:
Открытый класс CustomAdapter реализует ExpandableListAdapter {
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
Toast.makeText(context, "Start Activity", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
С ПОМОЩЬЮ ОТ Jared Burrows - Как создать интерфейс между Fragment и адаптером?
Добавлено несколько вещей в мой CustomAdapter и FragmentActivity
public class CustomAdapter implements ExpandableListAdapter {
public CustomAdapter(MainActivity fragmentactivity)
{
try
{
this.mAdapterCallback = ((AdapterCallback) fragmentactivity);
}
catch (ClassCastException e)
{
throw new ClassCastException("Fragment must implement AdapterCallback.");
}
}
public static interface AdapterCallback
{
void onMethodCallback();
}
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
Log.e("value","position"+childPosition);
Log.e("value","position"+groupPosition);
Log.e("value","position"+tempItems.get(groupPosition).getName());
mAdapterCallback.onMethodCallback();
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
И В МОЕЙ ОСНОВНОЙ ДЕЯТЕЛЬНОСТИ:
public class MainActivity extends FragmentActivity implements AdapterCallback
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
this.mMyAdapter = new CustomAdapter(this);
}
А затем добавил это за пределами Oncreate:
public void onMethodCallback()
{
Log.e("Call","VALUE");
}
}
но я все еще получаю ошибку NPE.. Это странно, когда я не использую обратный вызов, я не получаю NPE, но когда я использую обратный вызов, я получаю NPE: http://pastebin.com/wc2ByiFz
1 ответ
public class CustomAdapter implements ExpandableListAdapter {
Activity yourActivity
public CustomAdapter(Activity yourActivity)
{
this.yourActivity= yourActivity;
}
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
yourActivity.onYourClick(groupPosition);
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
//Your Fragment
public class yourActivity extends FragmentActivity{
public void onYourClick(int groupPosition){
}