Как ускорить уведомление о щелчке от GridView внутри фрагмента к слушателю активности? - PullRequest
0 голосов
/ 29 февраля 2012

Я пишу приложение, в котором есть несколько видов фрагментов, управляемых действием.Фрагменты в основном представляют собой GridView с кучей изображений и подробным представлением, которое запускается, когда пользователь нажимает на изображение в GridView.

Это все работает нормально, за исключением того, что существует множество других вещей, идущих от действия к фрагменту сетки (я постоянно добавляю вещи в представление сетки и отображаю их сразу), это занимает несколько секунд длящелчок, чтобы быть распознанным.Я предполагал, что создание образа будет занимать много времени, и что, когда я нажимаю на элемент, это событие должно быть немедленно отправлено в действие, так как в этом нет большой нагрузки.Как только сообщение попадает в действие, действие прекращает обновлять представление сетки и работает над созданием подробного представления.

Проблема здесь в том, что для щелчка по элементу в виде сетки требуется несколько секунд (от 5 до 10 на более медленном телефоне) для регистрации.Что мне нужно сделать, чтобы ускорить это действие?

Соответствующий код GridFragment:

public class GridFragment extends Fragment{
...
public class ImageAdapter extends BaseAdapter  {
    private GridContent gridContent;
    private Context mContext;

    ...
    public View getView(final int position, View convertView, ViewGroup parent) {
        // ImageView is my private holder class
        ImageView imageView;
        imageView = new ImageView(mContext);
        imageView.setImageBitmap(gridContent.get(position).getThumb());

        imageView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // This is what I expect to see immediately upon clicking something, 
                //  but takes several seconds to show up in logcat
                if (Constants.DEBUG){ Log.d(TAG, "an item was clicked  - " 
                    + gridContent.get(position).getId());}
                    //mListener is a listener implemented by my activity
                    // gridContent.get(position) just returns a small object, 
                    //  it shouldn't be doing much work
                    mListener.onItemSelected(gridContent.get(position));
            }

          });

        return imageView;
    }
}
}

Соответствующий код активности:

@Override
public void onItemSelected(Item item) {
    // Displays a loading dialog
    showLoadDialog();
    Item pi = item;
    // This builds an image from the web, it might be slow depending on the 
    //  phone's connection
    pi.genImage();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    hideLoadDialog();
    ft.addToBackStack(Constants.DETAILS_STACK)
    .add(android.R.id.content, DetailsFragment.newInstance(0,pi))
    .commit();
}

1 Ответ

1 голос
/ 15 апреля 2012

Я в основном решил эту проблему.Разрешение было специфичным для моей реализации, однако медлительность была вызвана тем фактом, что я выполнял много ресурсоемких задач, некоторые из которых выполнялись в потоке пользовательского интерфейса, а некоторые занимали немало памяти.

Я строил растровые изображения (в потоке, не являющемся пользовательским интерфейсом), извлекая данные с сервера и создавая изображение прямо в памяти, а затем добавляя это растровое изображение в сетку.Лучше всего было использовать AsyncTask для загрузки изображений на SD-карту, а затем добавить эти изображения, указав их расположение на SD-карте.Намного быстрее и сделал мое приложение более отзывчивым.

...