热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidUI设计——ListView练习(制作水果选择菜单)

http:blog.csdn.netTo_be_Designerarticledetails48009779功能说明:通过使用ListView制作一个

http://blog.csdn.net/To_be_Designer/article/details/48009779

功能说明:

  通过使用ListView制作一个水果选择菜单,菜单中有多种水果,菜单每种水果以水果选择框, 水果图片, 水果名称的形式展现在ListView中的每个Item中。

1. 通过水果多选框可以选择想要的水果。 
2. 通过点击每条Item的任意地方也可以选择水果。 
3. ListView最顶端设置有顶部全选按钮,通过点击按钮可以全部选中水果。 
4. ListView最低端设置有底部反选按钮,通过点击按钮可以反选水果。

这只是一个简单的小练习,界面比较简单粗略,仅用来练习使用,大神们不要嫌弃……嘿嘿

Frist.显示列表的实现

  做什么都是一步一步来的,首先我们要先构建显示列表,这就要用到我们在前一节所用到的自定义Adapter,通过自定义Adapter来构建显示列表。 
回想一下自定义Adapter的步骤:

  • M,即Model。构建数据。首先我们要先创建显示在水果菜单上的水果数据。定义一个Fruit类。
public class Fruit {
    private boolean mCheckBoxchecked;//是否选中水果。
    private int mImage;//水果图片
    private String mFruitName;//水果名称
    //自定义构造器,通过构造器来对水果初始化。
    public Fruit(int mImage, String mFruitName) {
        this.mImage = mImage;
        this.mFruitName = mFruitName;
    }

    public boolean ismCheckBoxchecked() {
        return mCheckBoxchecked;
    }

    public void setmCheckBoxchecked(boolean mCheckBoxchecked) {
        this.mCheckBoxchecked = mCheckBoxchecked;
    }

    public int getmImage() {
        return mImage;
    }

    public void setmImage(int mImage) {
        this.mImage = mImage;
    }

    public String getmFruitName() {
        return mFruitName;
    }

    public void setmFruitName(String mFruitName) {
        this.mFruitName = mFruitName;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • V,即View。构建数据显示的视图。我们是以什么样的形式来显示Fruit的。然后自定义一个Adapter,通过自定义的Adapter将水果数据添加到View视图中。 
       
      这里我们用下图方式来构建View视图,也就是水果显示的方式。布局文件就不在贴出,在最后会给出源代码。 
       
    这里写图片描述

       自定义的Adapter:

public class FruitAdapter extends BaseAdapter{

    private List mFruit;//水果数据
    private LayoutInflater mInflater;//LayoutInflater 加载布局
    //自定义构造器,接收数据和加载布局的LayoutInflater对象。
    public FruitAdapter(List mFruit, LayoutInflater mInflater) {
        this.mFruit = mFruit;
        this.mInflater = mInflater;
    }

    @Override
    public int getCount() {
        return mFruit.size();//获得Item的数量
    }

    @Override
    public Object getItem(int position) {
        return position;//获得Item的位置
    }

    @Override
    public long getItemId(int position) {
        return position;//获得Item的Id,我们这里依然返回位置。
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        //ViewHolder创建对象。
        ViewHolder viewHolder = new ViewHolder();
        //获得该Item下的水果对象。
        Fruit fruit =mFruit.get(position);
        if(cOnvertView== null){
            cOnvertView= mInflater.inflate(R.layout.item_list_fruit, null);
            viewHolder.checkBoxSelect = (CheckBox) convertView.findViewById(R.id.checkbox_select);
            viewHolder.imageViewFruit = (ImageView) convertView.findViewById(R.id.imageview_fruit);
            viewHolder.textViewFruitName = (TextView) convertView.findViewById(R.id.textview_fruitname);
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder) convertView.getTag();

        }
        viewHolder.imageViewFruit.setImageResource(fruit.getmImage());
        viewHolder.textViewFruitName.setText(fruit.getmFruitName());

        return convertView;
    }
    class ViewHolder{
        ImageView imageViewFruit;
        TextView textViewFruitName;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

   
C,即Control。控制总体,首先初始化数据,然后将自己设置好的View添加到ListView中。

Activity中的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <ListView  android:id="@+id/lisview_fruit" android:layout_width="match_parent" android:layout_height="match_parent">
    ListView>

RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Activity类:

public class MainActivity extends Activity {
    private List mFruit;
    private ListView mListViewFruit;
    private FruitAdapter mAdapter;
    private  LayoutInflater mInflater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得ListView的对象
        mListViewFruit = (ListView) findViewById(R.id.lisview_fruit);
        //获得布局加载对象
        mInflater = getLayoutInflater();
        //初始化数据
        initData();
        //创建自定义Adapter的对象
        mAdapter = new FruitAdapter(mFruit, mInflater);
        mListViewFruit.setAdapter(mAdapter);
    }
    //初始化数据。
    private void initData() {
        mFruit = new ArrayList();
        //有点偷懒,这里水果为了增加数量就循环添加了,不在一一初始化
        for (int i = 0; i <5; i++) {
            Fruit apple = new Fruit(R.mipmap.apple, "苹果");
            Fruit banana = new Fruit(R.mipmap.banana, "香蕉");
            Fruit grape = new Fruit(R.mipmap.grape, "葡萄");
            Fruit watermelon = new Fruit(R.mipmap.watermelon, "西瓜");
            Fruit pineapple = new Fruit(R.mipmap.pineapple, "菠萝");
            mFruit.add(apple);
            mFruit.add(banana);
            mFruit.add(grape);
            mFruit.add(watermelon);
            mFruit.add(pineapple);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

结果:

这里写图片描述

Two.选择框选择水果功能的实现

  第一步我们已经完成了基本的显示功能。让我们来添加第二个功能。通过点击水果图片前面的选择框来中水果。这就用到了CheckBox的点击事件。我们通过监听选择框的状态来断定选择的水果。

对自定义Adapter 修改如下(在getView()方法中添加店家事件。)

public class FruitAdapter extends BaseAdapter{

    private List mFruit;
    private LayoutInflater mInflater;
    private boolean[] mManagerCheckBox;//管理图片前选择框的状态。

    public FruitAdapter(List mFruit, LayoutInflater mInflater) {
        this.mFruit = mFruit;
        this.mInflater = mInflater;
        //初始化CheckBox的管理器,其长度为数据的数量。默认初始化值为false。
        mManagerCheckBox=new boolean[mFruit.size()];
    }

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

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {

        ViewHolder viewHolder = new ViewHolder();

        Fruit fruit =mFruit.get(position);
        if(cOnvertView== null){
            cOnvertView= mInflater.inflate(R.layout.item_list_fruit, null);
            viewHolder.checkBoxSelect = (CheckBox) convertView.findViewById(R.id.checkbox_select);
            viewHolder.imageViewFruit = (ImageView) convertView.findViewById(R.id.imageview_fruit);
            viewHolder.textViewFruitName = (TextView) convertView.findViewById(R.id.textview_fruitname);
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder) convertView.getTag();

        }
        viewHolder.imageViewFruit.setImageResource(fruit.getmImage());
        viewHolder.textViewFruitName.setText(fruit.getmFruitName());

        //添加点击事件
        viewHolder.checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                /* 对CheckBox进行赋值 */
                mManagerCheckBox[position] = isChecked;
                Log.d("data", "" + mFruit.get(position).getmFruitName() + "---------" + mManagerCheckBox[position] + "选中");
                notifyDataSetChanged();
            }
        });
        viewHolder.checkBoxSelect.setChecked(mManagerCheckBox[position]);

        return convertView;
    }
    class ViewHolder{
        CheckBox checkBoxSelect;
        ImageView imageViewFruit;
        TextView textViewFruitName;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

结果: 
这里写图片描述

Three.点击Item任意处选择水果功能的实现

  这个功能是很常见的,举例来说,我们逛淘宝,商品的展示就是用ListView控件来实现的,我们有时候想要进入某个商品的具体界面只需点击Item的任意一个位置就可以。我们现在就要实现这个功能。 
 实现这个功能前我们首先要了解一个知识点,当在一个Button上放置一个CheckBox,RadioButton或者其他按钮时,Button的点击就会被其上面的CheckBox,RadioButton或者其他按钮给“吃掉”。当我们点击屏幕时,是屏幕首先接收到这个点击事件,然后他会将这个点击事件通过硬件等一系列传送后报给View,然后View再将点击事件报给在顶端的CheckBox,RadioButton或者其他按钮,当顶端的CheckBox,RadioButton或者其他按钮接收到以后,一看不是自己的点击事件,就会将其给吃掉,不做任何反应,以至于点击底端的Button并没有反应。 
 解决此问题首先要让顶端的CheckBox,RadioButton或者其他按钮“不吃掉”底端按钮的点击,这是需要在CheckBox布局文件中添加如下语句:

android:focusable="false"
  • 1
  • 1

在Activity添加ListView的点击事件,在onCreate中添加如下:

        mListViewFruit.setAdapter(mAdapter);
        mListViewFruit.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long l) {
                mAdapter.itemChangge(position-1);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将ListView的点击与CheckBox相关联,在自定义Adapter中添加如下方法:

    /* 接收Activity传来的position,当position变化时调用。 */
    public void itemChangge(int position){
        mManagerCheckBox[position] = !mManagerCheckBox[position];
        notifyDataSetChanged();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

这里写图片描述

Four.顶部按钮全选的实现

  这里用到了ListView的一个功能:添加Header,在ListView的顶端添加布局。这里我们实现的功能是添加顶部按钮,所以我们只需要在顶端布局中添加一个按钮即可。 
   
顶部布局:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <CheckBox  android:id="@+id/checkbox_all_checked" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="全选" />

LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

自定义Adapter中添加全选操作:

    /* 设置全选的方法 */
    public  void itemAllChecked(){
        for (int i = 0; i true;
            notifyDataSetChanged();

        }
    }
    /* 设置全不选的方法 */
    public  void itemNoneChecked(){
        for (int i = 0; i false;
            notifyDataSetChanged();

        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Activity中添加:

public class MainActivity extends Activity {
    private List mFruit;
    private ListView mListViewFruit;
    private FruitAdapter mAdapter;
    private  LayoutInflater mInflater;

    //顶部按钮
    private View mHeaderAllChecked;
    private CheckBox mCheckBoxAllChecked;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListViewFruit = (ListView) findViewById(R.id.lisview_fruit);
        mInflater = getLayoutInflater();
        initData();
        /* 设置全选按钮 */
        mHeaderAllChecked =mInflater.inflate(R.layout.fruit_header, null);
        mCheckBoxAllChecked = (CheckBox) mHeaderAllChecked.findViewById(R.id.checkbox_all_checked);
        mCheckBoxAllChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (isChecked) {
                    mAdapter.itemAllChecked();

                } else {
                    mAdapter.itemNoneChecked();

                }
            }
        });
        mListViewFruit.addHeaderView(mHeaderAllChecked);

        mAdapter = new FruitAdapter(mFruit, mInflater);
        mListViewFruit.setAdapter(mAdapter);
        mListViewFruit.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long l) {
                mAdapter.itemChangge(position-1);
            }
        });
    }
    private void initData() {
       //此处省略……
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

结果: 
这里写图片描述

Four.底部按钮反选的实现

  这个和顶部按钮全选是先是相同的,只是实现的功能不同,此处不再赘述,直接上代码。 
   
底部布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
    <Button  android:id="@+id/button_negation_checked" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反选"/>

LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

自定义Adapter中添加全选操作:

    /* 设置取反的操作 */
    public  void itemNegationChecked(){
        for (int i = 0; i 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Activity中添加:

public class MainActivity extends Activity {
    private List mFruit;
    private ListView mListViewFruit;
    private FruitAdapter mAdapter;
    private  LayoutInflater mInflater;

    //顶部按钮
    private View mHeaderAllChecked;
    private CheckBox mCheckBoxAllChecked;

    //底部按钮
    private View mFooterNegationChecked;
    private Button mButtonNegation;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListViewFruit = (ListView) findViewById(R.id.lisview_fruit);
        mInflater = getLayoutInflater();
        initData();
        /* 设置全选按钮 */
        mHeaderAllChecked =mInflater.inflate(R.layout.fruit_header, null);
        mCheckBoxAllChecked = (CheckBox) mHeaderAllChecked.findViewById(R.id.checkbox_all_checked);
        mCheckBoxAllChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (isChecked) {
                    mAdapter.itemAllChecked();

                } else {
                    mAdapter.itemNoneChecked();

                }
            }
        });
        mListViewFruit.addHeaderView(mHeaderAllChecked);
        /* 设置取反按钮 */
        mFooterNegatiOnChecked= mInflater.inflate(R.layout.item_footer,null);
        mButtOnNegation= (Button) mFooterNegationChecked.findViewById(R.id.button_negation_checked);
        mButtonNegation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAdapter.itemNegationChecked();

            }
        });
        mListViewFruit.addFooterView(mFooterNegationChecked);


        mAdapter = new FruitAdapter(mFruit, mInflater);
        mListViewFruit.setAdapter(mAdapter);
        mListViewFruit.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long l) {
                mAdapter.itemChangge(position-1);
            }
        });

    }

    private void initData() {
       //此处省略……
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

结果:

这里写图片描述



推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • http头_http头部注入
    1、http头部注入分析1、原理 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
手机用户2502895461
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有