ListFragment и Контекстное меню

Интерфейс, диалоги, темы, стили, меню
Ответить
FeonoR
Сообщения: 5
Зарегистрирован: 07 мар 2015, 18:46

ListFragment и Контекстное меню

Сообщение FeonoR » 07 мар 2015, 19:05

Доброго времени суток.
Делаю приложение для диплома и решил, что просто вывод в ListView как-то не солидно, ListActivity - так и не получилось прикрутить ActionBar, поэтому остановился на ListFragment.
Собственно в двух словах суть такова: добавляем элемент и он отображает инфо-цию, удаляем элемент если не нужен нам.
Так вот с добавлением я разобрался, хотя и не сразу, а вот с удалением..
Если я удаляю элемент через кнопку на actionbar - все ок и работает, но при использовании контекстного меню уже ничего не получается.
Код по идее меняться не должен, но дело в том, что меню с элементами появляется, а код при нажатии на какой-нить элемент не выполняется, т.е. метод onOptionsItemSelected не вызывается. Просмотрел уже тучу всяких интернетов, не понимаю где и что у меня не так.

А теперь все необходимые исходники:
universal.java

Код: Выделить всё

package com.link.tes;

public class universal {

    public String balance = "";
    public String log = "";
    public String oper = "";
    public int icon;

    public universal(String o, String l, String b, int icon){
        this.log = l;
        this.oper = o;
        this.balance = b;
        this.icon = icon;
        Log.i("ok", "ok");
    }

    public String getOper() {
        return oper;
    }

    public void setOper(String title) {
        this.oper = oper;
    }

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getLog() {
        return log;
    }

    public void setLog(String num) {
        this.log = log;
    }
UniAdapter.java

Код: Выделить всё

package com.link.tes;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class UniAdapter extends BaseAdapter {

    Context context;
    ArrayList<universal> unilist;

    UniAdapter(Context context, ArrayList<universal> unilist){

        this.context = context;
        this.unilist = unilist;
    }

    @Override
    public int getCount() {

        return unilist.size();
    }

    @Override
    public Object getItem(int position) {

        return unilist.get(position);
    }

    @Override
    public long getItemId(int position) {

        return unilist.indexOf(getItem(position));
    }

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

        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item, null);
        }

        ImageView imgIcon = (ImageView) convertView.findViewById(R.id.imageView);
        TextView txtTitle = (TextView) convertView.findViewById(R.id.text1);
        TextView num = (TextView) convertView.findViewById(R.id.text2);

        universal uni_pos = unilist.get(position);
        imgIcon.setImageResource(uni_pos.getIcon());
        txtTitle.setText(uni_pos.getOper());
        num.setText(uni_pos.getLog());

        return convertView;
    }
list_fragment.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></TextView>

</LinearLayout>
list_item.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:padding="2dp">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="37dp"
        android:layout_marginStart="37dp"
        android:layout_toEndOf="@+id/imageView"
        android:layout_toRightOf="@+id/imageView"
        android:height="50dp"
        android:gravity="center_vertical|center|center_horizontal"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/text3"
        android:layout_alignWithParentIfMissing="false"
        android:layout_marginEnd="31dp"
        android:layout_marginRight="31dp"
        android:layout_toLeftOf="@+id/text3"
        android:layout_toStartOf="@+id/text3"
        android:layout_weight="0.98"
        android:height="50dp"
        android:gravity="center"
        android:text="Medium Text"
        android:textAlignment="center"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:height="50dp"
        android:gravity="center_vertical|center|center_horizontal"
        android:text="Large"
        android:textAlignment="center"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/text1"
        android:contentDescription="@string/imgdesc" />
</RelativeLayout>
strings.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Tes</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="imgdesc">imgdesc</string>
    <string name="action_add">Добавить</string>
    <string name="delete_crime">Удалить</string>
    <string name="add_crime">Добавить</string>

    <array name="icons">
        <item>@drawable/home</item>
        <item>@drawable/tutorials</item>
    </array>

</resources>
MainActivity.java

Код: Выделить всё

package com.link.tes;

import android.app.FragmentManager;
import android.app.ListFragment;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends ActionBarActivity {

    public static UniAdapter adapter;
    public static ArrayList<universal> uniItems = new ArrayList<>();
    static TypedArray menuIcons;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        menuIcons = getResources().obtainTypedArray(R.array.icons);
        uniItems = new ArrayList<>();
        adapter = new UniAdapter(this, uniItems);

        FragmentManager fm = getFragmentManager();

        if (fm.findFragmentById(android.R.id.content) == null) {
            MyListFragment list = new MyListFragment();
            fm.beginTransaction().add(android.R.id.content, list).commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
            case R.id.action_add:
                universal items = new universal("rtk", "123", "123", menuIcons.getResourceId(1, -1));
                uniItems.add(items);
                adapter.notifyDataSetChanged();
                return true;

            case R.id.action_del:
                uniItems.remove(0);
                adapter.notifyDataSetChanged();

            default:
                return true;
        }
    }


    static public class MyListFragment extends ListFragment implements AdapterView.OnItemClickListener {

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setListAdapter(adapter);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            return inflater.inflate(R.layout.list_fragment, null, false);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {

            getListView().setOnItemClickListener(this);
            registerForContextMenu(this.getListView());
            super.onActivityCreated(savedInstanceState);
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {

            Toast.makeText(getActivity(), menutitles[position], Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            getActivity().getMenuInflater().inflate(R.menu.list_item_context, menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            Log.i("ContextMenu", "Item ");
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            int pos = info.position;
//
            switch (item.getItemId()) {
                case R.id.menu_item_delete:
                    Log.i("ContextMenu", "Item 1a was chosen");
                    uniItems.remove(0);
                    adapter.notifyDataSetChanged();
                    return true;
                case R.id.menu_item_add:
                    Log.i("ContextMenu", "Item 1a was chosen");
                    universal items = new universal("rtk", "123", "123", menuIcons.getResourceId(1, -1));
                    uniItems.add(items);
                    adapter.notifyDataSetChanged();
//
                    return true;
                default:
                return super.onOptionsItemSelected(item);
            }
        }


    }
}
list_item_context.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?> <menu

    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_item_delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:title="@string/delete_crime" />
    <item android:id="@+id/menu_item_add"
        android:icon="@android:drawable/ic_menu_delete"
        android:title="@string/add_crime" />

</menu>
Заранее спс. Очень прошу ткнуть носом в косяк, потому что голова уже не соображает...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: ListFragment и Контекстное меню

Сообщение Foenix » 07 мар 2015, 19:20

решил, что просто вывод в ListView как-то не солидно
:shock:
Если "не солидно", то нужно было делать RecyclerView
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: ListFragment и Контекстное меню

Сообщение doter.ua » 07 мар 2015, 21:05

Индусы будут в востроге.

Код: Выделить всё

@Override 
    public long getItemId(int position) { 
        return unilist.indexOf(getItem(position)); 
    } 
А по сабжу: скинь R.menu.menu_main, там ид проставлены?

Так же попробуй http://stackoverflow.com/a/8309255
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

FeonoR
Сообщения: 5
Зарегистрирован: 07 мар 2015, 18:46

Re: ListFragment и Контекстное меню

Сообщение FeonoR » 08 мар 2015, 03:31

doter.ua писал(а):Индусы будут в востроге.

Код: Выделить всё

@Override 
    public long getItemId(int position) { 
        return unilist.indexOf(getItem(position)); 
    } 
Это вы о чем? Моя не понимать(
А по сабжу: скинь R.menu.menu_main, там ид проставлены?
Вот : menu_main.xml

Код: Выделить всё

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_add"
        android:icon="@android:drawable/ic_menu_add"
        android:orderInCategory="100"
        android:title="@string/action_add"
        app:showAsAction="ifRoom|withText" />
    <item
        android:id="@+id/action_del"
        android:icon="@android:drawable/ic_menu_delete"
        android:orderInCategory="100"
        android:title="@string/action_add"
        app:showAsAction="ifRoom|withText" />
</menu>
Только зачем ? С этим меню все в полном порядке.

Так же попробуй http://stackoverflow.com/a/8309255
Посмотрел - но решения нужного мне не нашел..

FeonoR
Сообщения: 5
Зарегистрирован: 07 мар 2015, 18:46

Re: ListFragment и Контекстное меню

Сообщение FeonoR » 08 мар 2015, 05:17

Застрелите меня кислым помидором за мою невнимательность - проблема в том, что я почему-то использовал метод: onOptionsItemSelected, а надо было onContextItemSelected. Просто фейспалм...

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: ListFragment и Контекстное меню

Сообщение doter.ua » 08 мар 2015, 12:37

FeonoR писал(а):Застрелите меня кислым помидором за мою невнимательность - проблема в том, что я почему-то использовал метод: onOptionsItemSelected, а надо было onContextItemSelected. Просто фейспалм...

Код: Выделить всё

   @Override  
    public long getItemId(int position) {  
        return unilist.indexOf(getItem(position));  
    }  
return unilist.indexOf(getItem(position)); эквивалентно return position;
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить