Androidの共通インタフェースコントロール2

A、ListViewコントロールの使用

 リストビューは、コンテンツデータの一覧を示す、高度に適応応じて一覧画面を表示することができます。

プロパティ名

機能説明

アンドロイド:listSelector

エントリをクリックすると、背景色のエントリを変更

アンドロイド:ディバイダ

セット分割線の色

アンドロイド:dividerHeight

分割ラインの高さを設定します

アンドロイド:スクロールバー

スクロールバーを表示するかどうかを

アンドロイド:fadingEdge

黒い影の上部と下部を削除します

   共通データアダプタ(アダプタ):データアダプタと変換器と同様であり、データビューとの間のブリッジは、複合的に許容されるようレンダリングにユーザデータを変換します。

    一般的なデータアダプタBaseAdapter、SimpleAdapter、ArrayAdapter

    ①BaseAdapterは、それが不可欠アダプタであることを示唆しています。彼は実際には抽象クラス、通常は継承BaseAdapterカスタムアダプタです。

    BaseAdapter方法

 

メソッド名
機能説明
公共int型同様にgetCount()
アイテムは、エントリの総数を取得します。
パブリックオブジェクトのgetItem(int型の位置)
位置に基づいてアイテムオブジェクトを取得する(位置)
公共長いgetItemId(int型の位置)
それはアイテムのIDに基づいて位置をとる(位置)
パブリックビューgetViewメソッド(int型の位置、表示convertView、のViewGroupの親)
アイテムのビューに対応する対応する位置を取得するには、位置は、現在の項目の位置、古いビューを多重化するためのconvertView、ロードXMLレイアウトの親です。

 

②SimpleAdapterはBaseAdapter、BaseAdapter道具4つの抽象メソッドとカプセル化から継承されました。データSimpleAdapter適応を使用する場合したがって、唯一のコンストラクタに適切なパラメータを渡す必要があります。次のようにSimpleAdapter特定情報の構成方法は次のとおりです。

③ArrayAdapterまたBaseAdapterサブクラス、使用及びSimpleAdapter同様に、開発者は、コンストラクタの内部とすることができる適切なパラメータを渡す必要があります。ArrayAdapter一般のTextViewコントロールを適応させるために使用されます。次のように設定:

public ArrayAdapter(Context context,int resource);    //context上下文对象 resource Item布局的资源ID
public ArrayAdapter(Context context,int resource, int textViewResourceId);    //textViewResourceId    Item布局中相应TextView的id
public ArrayAdapter(Context context,int resource,T[] objects);    //objects    需要适配的数组类型的数据
public ArrayAdapter(Context context,int resource,int textViewResourceId,T[] objects);    
public ArrayAdapter(Context context,int resource,List<T> objects);
public ArrayAdapter(Context context,int resource,int textViewResourceId, List<T> objects)    //需要适配的List类型的数据

ListViewのケース:

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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="购物商城"
        android:textColor="#FFFFFF"
        android:background="#FF8F03"
        android:gravity="center"
        />
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:layout_centerVertical="true"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/iv"
        android:layout_centerVertical="true">
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="桌子"
            android:textSize="20sp"
            android:textColor="#000000"/>
        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="价格"
            android:textSize="20sp"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/title"
            android:textColor="#FF8F03"/>
        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1000"
            android:textSize="20sp"
            android:layout_below="@+id/title"
            android:layout_toRightOf="@id/tv_price"
            android:textColor="#FF8F03"
            android:layout_marginTop="10dp"/>

    </RelativeLayout>

</RelativeLayout>

 

MainActivity.java

package com.example.listviewdemo;


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;


import org.w3c.dom.Text;


public class MainActivity extends AppCompatActivity {
    private String[] titles = {"桌子","苹果","蛋糕","线衣","猕猴桃"};
    private String[] prices = {"1800元","10元/kg","300元","350元","10元/kg"};
    private int[] icons = {R.drawable.table,R.drawable.apple,R.drawable.cakes,R.drawable.wireclothes,R.drawable.scarf};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = findViewById(R.id.lv);
        MyBaseAdapter adapter = new MyBaseAdapter();
        listView.setAdapter(adapter);
    }


    class MyBaseAdapter extends BaseAdapter{


        @Override
        public int getCount() {         //获取item总数
            return titles.length;
        }


        @Override
        public Object getItem(int i) {      //返回items的数据对象
            return titles[i];
        }


        @Override
        public long getItemId(int i) {      //返回items的id
            return i;
        }


        @Override
        public View getView(int i, View convertview, ViewGroup viewGroup) {    //返回items的view视图
            //方案一
//            //将xml转换成view对象
//            View view = View.inflate(MainActivity.this,R.layout.list_item,null);
//            //初始化view对象的控件
//            TextView title = view.findViewById(R.id.title);
//            TextView price = view.findViewById(R.id.price);
//            ImageView imageView = view.findViewById(R.id.iv);
//            title.setText(titles[i]);
//            price.setText(prices[i]);
//            imageView.setImageResource(icons[i]);
//            return view;
            ViewHolder holder;
            if(convertview == null){
                convertview = View.inflate(MainActivity.this,R.layout.list_item,null);
                holder = new ViewHolder();
                holder.title = convertview.findViewById(R.id.title);
                holder.price = convertview.findViewById(R.id.price);
                holder.iv = convertview.findViewById(R.id.iv);
                convertview.setTag(holder);
            }else{
                holder = (ViewHolder)convertview.getTag();
            }
            holder.title.setText(titles[i]);
            holder.price.setText(prices[i]);
            holder.iv.setImageResource(icons[i]);


            return convertview;
        }
    }
    class ViewHolder{
        TextView title;
        TextView price;
        ImageView iv;
    }
}

結果:

二、RecyclerVi EW使用

RecyclerView:Android5.0は、ウィンドウの限られた範囲内で大量のデータのコントロールを表示するために提供された後。

 

リストビューと比較すると、RecyclerViewの利点は以下のとおりです。 

  • 効果を示す:エフェクトのRecyclerView制御リストは、横または縦のLayoutManagerクラスGridViewのカスケード効果や効果によって達成することができ、かつ垂直リストListViewコントロールの効果を得ることができます。 

  • アダプタ:RecyclerView.Adapterアダプタを使用してRecyclerViewコントロール、()メソッドとonBindViewHolder()メソッド、必須使用ViewHolderクラス、コーディング標準、onCreateViewHolderアダプターますgetViewメソッドでBaseAdapter()メソッド分割が書き込みに初心者を回避コードのパフォーマンスの低下。

リストビューと比較すると、RecyclerViewの利点は以下のとおりです。

  • 効果を多重化:RecyclerViewコントロール自体によって実装項目オブジェクトの再利用の作業を制御し、ListViewコントロールアイテムオブジェクトの再利用作業がsetTag()メソッドとのgetTag()メソッドの現像convertViewによって操作される必要があります。 

  • アニメーション:RecyclerViewコントロールはsetItemAnimator()メソッドアニメーション項目ができ、リストビューコントロールこの方法によりアニメート項目できません。

例:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>
</RelativeLayout>

recycler_item.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="wrap_content"
    android:padding="16dp"
    android:orientation="horizontal">


    <ImageView
        android:id="@+id/iv"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:src="@drawable/siberiankusky"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#FF8F03"
            android:text="哈士奇"/>
        <TextView
            android:id="@+id/introduce"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/name"
            android:textColor="#FF716C"
            android:minLines="2"
            android:ellipsize="end"
            android:text="西伯利亚雪橇犬,常见别名哈士奇,昵称为二哈"/>


    </RelativeLayout>


</LinearLayout>

MainActicty.java

package com.example.recyclerview;


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;


import org.w3c.dom.Text;


public class MainActivity extends AppCompatActivity {
    private RecyclerView recycleview;
    private HomeAdapter homeAdapter;
    private String[] names = { "小猫", "哈士奇", "小黄鸭","小鹿","老虎"};
    private int[]  icons= { R.drawable.cat,R.drawable.siberiankusky,
            R.drawable.yellowduck,R.drawable.fawn, R.drawable.tiger};
    private String[] introduces = {
            "猫,属于猫科动物,分家猫、野猫,是全世界家庭中较为广泛的宠物。",
            "西伯利亚雪橇犬,常见别名哈士奇,昵称为二哈。",
            "鸭的体型相对较小,颈短,一些属的嘴要大些。腿位于身体后方,因而步态蹒跚。",
            "鹿科是哺乳纲偶蹄目下的一科动物。体型大小不等,为有角的反刍类。",
            "虎,大型猫科动物;毛色浅黄或棕黄色,满有黑色横纹;头圆、耳短,耳背面黑色,中央有一白斑甚显著;四肢健壮有力;尾粗长,具黑色环纹,尾端黑色。"
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycleview = findViewById(R.id.recycleview);   //初始化recycleview
        recycleview.setLayoutManager(new LinearLayoutManager(this/*,LinearLayoutManager.HORIZONTAL,true*/));//设置recleview 的布局方式为线性布局默认为垂直方向
        homeAdapter = new HomeAdapter();
        recycleview.setAdapter(homeAdapter);    //设置适配器
    }


    class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{   //自定义适配器


        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.recylcer_item,parent,false);    //将xml转换成view控件
            MyViewHolder myViewHolder = new MyViewHolder(view);     //放置在Holder中
            return myViewHolder;
        }


        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {  //给适配器绑定Holder
            holder.name.setText(names[position]);
            holder.introduce.setText(introduces[position]);
            holder.iv.setImageResource(icons[position]);
        }


        @Override
        public int getItemCount() {
            return names.length;
        }   //返回items的长度


        class MyViewHolder extends RecyclerView.ViewHolder{     //自定义holder
            TextView name;
            TextView introduce;
            ImageView iv;
            public MyViewHolder(@NonNull View itemView) {   //设置holder的变量
                super(itemView);
                name =(TextView) itemView.findViewById(R.id.name);
                introduce =(TextView) itemView.findViewById(R.id.introduce);
                iv =(ImageView) itemView.findViewById(R.id.iv);
            }
        }
        }
    }

結果:

 

第三に、カスタムビュー

制御システムが要件を満たしていない場合は、カスタムコントロールを必要とします。最も単純なカスタムビューは、Viewクラスまたはサブクラスから継承するクラスを作成し、クラスのコンストラクタをオーバーライドすることです。

public class Customview extends View{
    public Customview(Context context) {    //在Java代码中创建对象时,使用该构造函数
         super(context);
     }
     public Customview(Context context, AttributeSet attrs) {    //在XML布局中引入自定义控件时,使用该构造函数
         super(context, attrs);    
     }
 }

システムが機能要件を満たすことができないスタイルやコントロールが付属していますので、私たちは、カスタムビューで指定したメソッドを書き換えることにより、余分なスタイルと機能を追加する必要があります。

カスタムビューは、従来の三つの方法は次のとおりです。 

  • onMeasure()メソッド:測定。 

    onMeasure(int型widthMeasureSpec、int型heightMeasureSpec)

    コントロールの指定された親コンテナwidthMeasureSpec幅を取得し、heightMeasureSpecは、親コンテナコントロールの指定された高さを得ます

  • onDraw()メソッド:画像を描画します。 

    キャンバスは、キャンバスを表し、彼はペイントカテゴリ(ブラシ)を使用しました。

  • onLayout()メソッド:中性子制御の位置のレイアウトを指定します。

    onLayout(ブール値が変更され、int型は、int型トップ、int型の右、int型の下を左) 

    カスタムビューの表現は、サイズを変更し、場所が変更されました。左は、トップは、右、左下には、それぞれ、トップは、右、子供の底から親コンテナを制御します。

 

測定モード

  • EXACTLY:特定の値にカスタム値の幅と高さが100dpとして使用する場合場合、この時の幅と高さの値は、正確なサイズのコントロールです。 

  • AT_MOST:アスペクト値場合wrap_contentカスタムコントロール、得られるコンテンツ制御値空間制御データの最大値の場合には幅と高さ。 

  • UNSPECIFIED:親コンテナは、カスタム値の幅と高さを指定しない場合に使用します。

注:widthMeasureSpecとheightMeasureSpecは、親コンテナの幅と制御の高さ指定されたパラメータが、制御もsetMeasuredDimension(int型、int)メソッドによって特定の幅と高さを設定する必要があります。

 

例:

cirecleview.java

package com.example.myapplication;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;


import androidx.annotation.Nullable;


public class circleview extends View {


    public circleview(Context context) {
        super(context);
    }


    public circleview(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //半径
        int r = getMeasuredHeight()/2;
        //圆心位置
        int centerX = getLeft() + r;
        int centerY = getTop() + r;
        Paint paint = new Paint();
        paint.setColor(Color.RED);


        //绘制
        canvas.drawCircle(centerX,centerY,r,paint);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.example.myapplication.circleview
        android:layout_width="100dp"
        android:layout_height="100dp"
        tools:ignore="MissingConstraints" />


</RelativeLayout>

 

結果:

公開された40元の記事 ウォンの賞賛2 ビュー5161

おすすめ

転載: blog.csdn.net/Dnesity/article/details/104806737