@1q2w1q2w
sudo make install

Android SearchDialog Как грузить данные в тот же Activity/ GridView?

Есть приложение, которое использует стандартный Android Search Dialog:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gridview);

        mGridView = (GridView) findViewById(R.id.gridView);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);

        // Search Dialog
        GridViewActivity.this.onSearchRequested();
        // Intent
        Intent intent = getIntent();
        // Check Intent type
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            // Get search string from extra
            String query = intent.getStringExtra(SearchManager.QUERY);
            // Search
            Log.d(TAG, query);
            showResults(query);
        }

        //Scroll listener
        mGridView.setOnScrollListener(ScrollListener);

        //Initialize with empty data
        mGridData = new ArrayList<>();
        mGridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, mGridData);
        mGridView.setAdapter(mGridAdapter);

       // ...
       showResults(); // здесь надо обновить GridView

      // далее добавляю данные так:
      protected void onPostExecute(Integer result) {
            // Download complete. Lets update UI
            if (result == 1) {
                mGridAdapter.setGridData(mGridData);
                mGridAdapter.notifyDataSetChanged();

                // Search Dialog 
                GridViewActivity.this.onSearchRequested();
            } else { Log.d(TAG, "result == 0" ); }
     }

Приложение основано на ActionBarActivity. Состоит из GridView и адаптера для добавления новых элементов. SearchDialog вроде работает, запросы отлавливает.
НО! При каждом вводе запроса в диалог, открывается новое "окно", активность ... не знаю как назвать .. т.е. новые данные не заменяют элементы в созданном GridView, а вроде как создается новый GridView. а при нажатии кнопки "назад", GridView с новыми элементами закрывается и показывается старый GridView со старыми элементами.
Проще говоря: каждый новый поиск добавляет окно с новыми результатами, а старые данные остаются в памяти и показываются при нажатии кнопки "назад".
Как это исправить? Как сделать, чтобы новые данные отображались в том же GridView, перерисовывая его.
Код адаптера:
public class GridViewAdapter extends ArrayAdapter<GridItem> {

    private Context mContext;
    private int layoutResourceId;
    private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();

    public GridViewAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) {
        super(mContext, layoutResourceId, mGridData);
        this.layoutResourceId = layoutResourceId;
        this.mContext = mContext;
        this.mGridData = mGridData;
    }


    /**
     * Updates grid data and refresh grid items.
     *
     * @param mGridData
     */
    public void setGridData(ArrayList<GridItem> mGridData) {
        this.mGridData = mGridData;
        notifyDataSetChanged();
    }

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

        if (row == null) {
            LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.titleTextView = (TextView) row.findViewById(R.id.grid_item_title);
            holder.imageView = (ImageView) row.findViewById(R.id.grid_item_image);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }

        GridItem item = mGridData.get(position);
        holder.titleTextView.setText(Html.fromHtml(item.getTitle()));

        Picasso.with(mContext).load(item.getImage()).into(holder.imageView);
        return row;
    }

    static class ViewHolder {
        TextView titleTextView;
        ImageView imageView;
    }
}


И еще небольшой вопрос: обрабатываю скролл вот так:
GridView.OnScrollListener ScrollListener =  new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }

        @Override
        public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
            LoadMore = firstVisible + visibleCount >= totalCount;
            //need to load more items
            if (LoadMore && finished) {
                updateView(REQUEST, totalCount);
            }
        }

    };

но, как я понял, onScroll вызывается и при создании сетки, и при самом скролле по несколько раз. Моя программа должна получать данные с интернета и отображать их в гриде, но при множественных вызовах onScroll - функция обновления данных и самого GridView вызывается по несколько раз, что не есть хорошо. Хочется, чтобы грузилась только та часть, которая сейчас должна отображаться: firstVisible + visibleCount, без лишних загрузок данных. Может есть советы на этот счет? Заранее всем спасибо!)
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
@1q2w1q2w Автор вопроса
sudo make install
Нашел решение:
в манифест добавляется
android:launchMode="singleTop"
а в активности отлавливаем Intent:
@Override
    public void onNewIntent(Intent intent) {
        String query = null;
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            query = intent.getStringExtra(SearchManager.QUERY);
            Log.i(TAG, "Received a new search query: " + query);
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы