Преобразование массива элементов WebHistory в массив строк в Xamarin Android Webview

#android #arrays #xamarin #webview #history

#Android #массивы #xamarin #webview #история

Вопрос:

У меня есть действие, которое должно отображать список посещенных URL-адресов пользователем, я извлекаю историю, используя логику элементов WebViewHistory, и заполняю данные в свой макет с помощью адаптера массива ListView. За исключением того, что элемент WebViewHistory отображается на этом машинном языке, который не может быть понятен людям. Например, один список имеет историю как p7@5561337 .Мне просто нужен код, который я могу использовать для преобразования массива WebViewHistoryItem в удобочитаемый строковый массив

   class History : AppCompatActivity 
    {
        ListView listView;
        WebView mywebview;
         protected override void OnCreate(Bundle savedInstanceState)
        {
         mywebview = Internet.webview;
            WebHistoryItem[] webHistories = new WebHistoryItem[size];
             int size = webviewHistory.Size;
            for(int i = 0; i <size; i  )
            {
                webHistories[i] = webviewHistory.GetItemAtIndex(i);
            }
     //Locate listview in Resource Layout
           histView = (ListView)FindViewById<ListView>(Resource.Id.mainlistview);
      //populate webview history item into listview
           histView.Adapter = new ArrayAdapter(this, 
            Android.Resource.Layout.SimpleListItem1,webHistories);
        }
    
    }
  

В предыдущем действии я определил webview как статический и общедоступный, позволяющий мне получить доступ к его экземпляру в этом действии, как я могу преобразовать webhistories array в string Большое спасибо за помощь

Комментарии:

1. learn.microsoft.com/en-us/dotnet/api/…

2. Спасибо, Джейсон, я собираюсь попробовать это и посмотреть, смогу ли я получить URL-адрес истории, заполненный в моем listview…

3. Я использую это, но все еще получаю указатель хранилища URL-адресов, пожалуйста, помогите string[] histo = new string[] { webviewHistory.GetItemAtIndex(0).Url.ToString()};

4. Эй, Джейсон, я кое-что понял, я могу получить заголовок текущего URL-адреса с помощью этого метода « string[] my=new string[] { webviewHistory. CurrentItem. Title };«, можем ли мы объяснить это отсюда?

Ответ №1:

я кое-что понял, я могу получить заголовок текущего URL-адреса с помощью этого метода string[] my=new string[] { webviewHistory.CurrentItem.Title } ; , можем ли мы объяснить это отсюда?

ДА.

Я использую это, но все еще получаю указатель хранилища URL-адресов, пожалуйста, помогите string[] histo = new string[] { webviewHistory .GetItemAtIndex(0).Url.toString()};

Вы можете использовать List для записи истории. Я создаю модель с именем VisitHistroy . И одновременно отображать заголовок и URL-адрес в listview, как этот GIF.

введите описание изображения здесь

Вот мой полностью код.

      [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        EditText editText1;
        WebView webView1;
        ListView listView1;
        Button button1;
        public delegate void OnLinkSelectedHandler(string url);
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

             editText1= FindViewById<EditText>(Resource.Id.editText1);
             webView1 = FindViewById<WebView>(Resource.Id.webView1);
             listView1 = FindViewById<ListView>(Resource.Id.listView1);
             button1= FindViewById<Button>(Resource.Id.button1);
            button1.Click  = Button1_Click;
           
            webView1.LoadUrl("http://stackoverflow.com");
            webView1.Settings.JavaScriptEnabled = true;
            webView1.SetWebViewClient(new MyWebviewClient(this.ISVistedSoLink));
        }

        private void Button1_Click(object sender, System.EventArgs e)
        {
            // throw new System.NotImplementedException();

            WebBackForwardList wbfl = webView1.CopyBackForwardList();
            int size = wbfl.Size;
            var webHistories = new WebHistoryItem[wbfl.Size];
            List<VisitHistroy> strs = new List<VisitHistroy>();
          

            for (int i = 0; i < size; i  )
            {
                //  histo = new string[] { wbfl.GetItemAtIndex(0).Url.ToString() };

                strs.Add(new VisitHistroy() { Title = wbfl.GetItemAtIndex(i).Title.ToString(), Url = wbfl.GetItemAtIndex(i).Url.ToString() });
                
            }
            //SimpleAdapter(Context? context, IList<IDictionary<string, object>>? data, int resource, string[]? from, int[]? to);
            listView1.Adapter = new MyAdapter(this, strs);
        }

        public void ISVistedSoLink(string url)
        {
            editText1.Text = url;
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    internal class MyAdapter : BaseAdapter<VisitHistroy>
    {
        private MainActivity mainActivity;
        private List<VisitHistroy> strs;

        public MyAdapter(MainActivity mainActivity, List<VisitHistroy> strs):base()
        {
            this.mainActivity = mainActivity;
            this.strs = strs;
        }

        public override VisitHistroy this[int position] => strs[position];

        public override int Count => strs.Count;

      

        public override long GetItemId(int position)
        {
           return position;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var item = strs[position];
            View view = convertView;
            if (view == null) // no view to re-use, create new
                view = mainActivity.LayoutInflater.Inflate(Resource.Layout.Itemlayout, null);
            view.FindViewById<TextView>(Resource.Id.itemTitle).Text = item.Title;
            view.FindViewById<TextView>(Resource.Id.itemurl).Text = item.Url;
           
            return view;
        }
    }

    public class VisitHistroy
    {
        public string Title { get; set; }
        public string Url { get; set; }
    }
}
  

Вот пользовательский элемент.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="15dp"
        android:textStyle="bold"
        android:text="@string/abc_font_family_title_material"
        android:id="@ id/itemTitle"/>
     <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/abc_font_family_title_material"
        android:id="@ id/itemurl"/>
</LinearLayout>
  

Вот activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:inputType="text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@ id/editText1"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="Get"
        android:id="@ id/button1"/>
    <android.webkit.WebView
        android:layout_width="match_parent"
        android:layout_height="350dip"
        android:id="@ id/webView1"
         />
    <ListView
        android:id="@ id/listView1"
        android:layout_width="match_parent"
        android:layout_height="200dip"/>
</LinearLayout>
  

Комментарии:

1. Эй, вы определили переменную webhistories , но не использовали ее, можете ли вы объяснить, почему это так?

2. Я получаю эту ошибку, не могу преобразовать из Browser.History в Browser.MainActivity в этой строке listView1.Adapter = new MyAdapter(this,strs);