несколько параметров типа в haskell вводят классы

Как @MikeM. предложено в комментарии

Ну, есть несколько разных способов сделать это. Предполагая, что articleShareBtn находится на каждой отдельной странице, возможно, самым простым будет articleShareBtn.setTag (rootView) после строки rootView = ..., затем измените свой метод на частный Bitmap takeScreenshot (View root) {root.setDrawingCacheEnabled (true); ...}, а внутри onClick () вы бы назвали его как Bitmap screenshotBitmap = takeScreenshot ((View) view.getTag ()) ;. Подписывайтесь на меня? В противном случае, вы можете сохранить карту всех просмотров страниц и использовать текущий индекс, чтобы получить правильный. При необходимости есть несколько других способов.

Я получил это работает. Мой обновленный код адаптера

public class ArticleAdapter extends PagerAdapter {

   public List<Articles> articlesListChild;
   private LayoutInflater inflater;
   Context context;
   View rootView;

   public ArticleAdapter(Context context) {
      super();
      this.context = context;
   }

   @Override
   public int getCount() {
      return articlesListChild.size();
   }


   @Override
   public void destroyItem(View collection, int position, Object view) {
      ((ViewPager) collection).removeView((View) view);
   }

   @Override
   public boolean isViewFromObject(View view, Object object) {
      return view == object;
   }


   @SuppressLint("ClickableViewAccessibility")
   @Override
   public Object instantiateItem(ViewGroup container, final int position) {
      inflater = LayoutInflater.from(container.getContext());
      View viewLayout = inflater.inflate(R.layout.article_single_item, null, false);
      final ImageView contentIv, imageContentIv;
      TextView contentHeadTv, contentBodyTv, sharingTextTv;
      LinearLayout articleDetailsLl;
      final LinearLayout articlesPager, articleBookmarkBtn,
      articleBookmarkedBtn, articleShareBtn;

      contentIv = (ImageView) viewLayout.findViewById(R.id.content_iv);
      contentHeadTv = (TextView) viewLayout.findViewById(R.id.content_head_tv);
      contentBodyTv = (TextView) viewLayout.findViewById(R.id.content_body_tv);
      articlesPager = (LinearLayout) viewLayout.findViewById(R.id.article_pager);

      articlesLayout = (LinearLayout) viewLayout.findViewById(R.id.articles_layout);

      rootView = viewLayout.findViewById(R.id.post_main_cv);
    articleShareBtn.setTag(rootView);


      RequestOptions requestOptions = new RequestOptions();
      requestOptions.placeholder(R.drawable.placeholder);
      articlesLayout.setVisibility(View.VISIBLE);
      Glide.with(context)
          .setDefaultRequestOptions(requestOptions)
          .load(articlesListChild.get(position).getArticleImage())
          .into(contentIv);
      toolbar.setVisibility(GONE);
      articlesPager.setVisibility(GONE);
      contentIv.setScaleType(ImageView.ScaleType.FIT_XY);
        contentHeadTv.setText(articlesListChild.get(position).getArticleHeading().trim());
        contentBodyTv.setText(articlesListChild.get(position).getArticleContent().trim());
        contentSourceTv.setText(articlesListChild.get(position).getArticleSource().trim());
      contentSourceTv.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Uri uri = Uri.parse(articlesListChild.get(position).getArticleSourceLink());
              Intent intent = new Intent(Intent.ACTION_VIEW, uri);
              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              context.startActivity(intent);
          }
       });

       articleShareBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Bitmap screenshotBitmap = takeScreenshot((View) view.getTag());
              saveAndShareScreenshot(screenshotBitmap);
          }
       });

       container.addView(viewLayout, 0);
       return viewLayout;

   }

   private Bitmap takeScreenshot(View root) {
       root.setDrawingCacheEnabled(true);
       Bitmap screenshotBitmap = root.getDrawingCache();
       return screenshotBitmap;
   }

   private void saveAndShareScreenshot(Bitmap screenshotBitmap) {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        // Save Screenshot
        File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/MyApp Screenshots");
        myDir.mkdir();
        String fname = "Image-" + 1 + ".jpg";
        File file = new File(myDir, fname);
        if (file.exists()) {
            file.delete();
        }
        try {
            file.createNewFile();
            FileOutputStream out = new FileOutputStream(file);
            screenshotBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        MediaScannerConnection.scanFile(context, new String[]{file.toString()}, new String[]{file.getName()}, null);
        // Share Screenshot
        file.setReadable(true, false);
        final Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri photoURI = FileProvider.getUriForFile(context, "com.xyz.abcapp.provider", file);
        String shareBody = "Share"
        intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Read this article");
        intent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
        intent.putExtra(Intent.EXTRA_STREAM, photoURI);
        intent.setType("image/*");
        context.startActivity(Intent.createChooser(intent,"Share Using"));
    } else {
        Toast.makeText(context, "Permissions not granted", Toast.LENGTH_SHORT).show();
    }
}
9
задан Don Stewart 17 April 2011 в 08:35
поделиться

3 ответа

См. также Данные. Складной в стандартной библиотеке, которая обеспечивает a toList функция для любого Foldable экземпляр. Foldable берет немного изощренности для инстанцирования, но это была бы хорошая практика. В качестве награды, Ваш HTree тип является почти точно тем же как экземпляром в качестве примера в документации.

Кроме того, я рекомендую изменить Ваш HTree кому:

data HTree a = Nil | Node a (HTree a) (HTree a)

И затем использование HTree (a,b) вместо HTree a b. Эта версия единственного параметра будет более легко компонуема со стандартными типами и экземплярами, и это становится главным из того, что продолжается, так как это зависит от обоих параметров таким же образом. Это также a Functor, и определение такого экземпляра сделает этот тип действительно хорошим работать с.

9
ответ дан 3 November 2019 в 00:05
поделиться

Я рекомендовал бы, чтобы классы Типа не были так же полезны, как они сначала кажутся - если предполагаемый класс имеет всего один метод интерфейса, рассмотрите объявление функционального типа вместо этого. Я произошел из среды OO также и нашел, что провел слишком много времени, пытаясь сделать "класс" средним, что я думал, что это означало, когда действительно я должен был использовать "данные".

Намного легче только записать Ваш toList' функция и затем 'снять' его для работы на структуру данных. На самом деле приветствуемое еще одно Учебное руководство Haskell проходит обширное осуществление, показывающее, как оно сделано и использует двоичное дерево в качестве примера. Большая вещь о выполнении лифта является этим, отличает то, что важно - структура типа данных, не реализация toList' - поэтому, после того как лифт сделан для выполнения 'в обходе порядка типа данных', можно использовать лифт, чтобы сделать что-либо - toList, печать, безотносительно. Поддержка toList не является важной частью структуры данных, таким образом, это не должно быть в объявлении класса - важная часть - то, как пересечь структуру данных.

4
ответ дан 3 November 2019 в 00:05
поделиться

Вы, вероятно, хотите выбрать последнюю опцию для класса ToList и сделать (HTree a) экземпляр ToList. Затем toList имеет тип (HTree a b) -> [b], не, например, (HTree a b) -> [(a,b)]. Я предполагаю, что Вы думаете столь же "ключевой" и тип "значения" как b.

class ToList a where
    toList :: a b -> [b]

data HTree a b = Nil | Node a b (HTree a b) (HTree a b)

instance ToList (HTree a) where
    toList Nil = []
    toList (Node x y l r) = toList l ++ [y] ++ toList r

test = toList (Node "a" 1 (Node "b" 2 Nil Nil) Nil)
-- test == [2,1]
-1
ответ дан 3 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

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