Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android-RecyclerView(解析二)

Android-RecyclerView(解析二)

編輯:關於Android編程

添加點擊事件,以及layoutManager的使用

1、適配器的編寫

package com.example.recyclerview;

import java.util.List;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyAdapter extends RecyclerView.Adapter implements View.OnClickListener{

    private Context context;
    private Listlist;
    //4.1 創建接口對象
    private OnChildClickListener listnener;
    private RecyclerView recvclerView;

    //4.2 添加set監聽方法,以防止與系統重名,修改方法名setOnChildListnener
    public void setOnChildClickListnener(OnChildClickListener listnener) {
        this.listnener = listnener;
    }

    /**
     * 3、MyAdapter的構造方法添加構造方法
     */
    public MyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }
    /**
     * 1、編寫viewHolder:注意再listView當中我們編寫的viewHolder是我們自定義的,但是再RecyclerView
     * 中viewholder被規范化了,它需要繼承自RecyclerView的viewHolder,寫好自己的ViewHolder
     */
    public static class MyViewHolder extends RecyclerView.ViewHolder{

        private TextView text;
    /**
     * 2、編寫viewHolder的構造方法
     */
        public MyViewHolder(View itemView) {
            super(itemView);
            //2.1找到item中的text
            text=(TextView) itemView.findViewById(R.id.item_text);
        }


    }
    /**
     * 3、實現它的三個抽象方法
     */

    /**
     * 返回這個adpter中一共有多少條數據
     */
    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return list.size();
    }
    /**
     * 把現在的數據綁定到原有的viewHolder上
     */
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.text.setText(list.get(position));


    }
    /**
     * 相當於在listview中,onCreatView為空時,需要去創建viewHolder
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view=LayoutInflater.from(context).inflate(R.layout.item, parent,false);
    //7、由adapter去實現裡面的抽象方法
    view.setOnClickListener(this);

    return new MyViewHolder(view);
    }
    //8、抽象方法
    @Override
    public void onClick(View v) {
        //8.1為了安全起見我們首先進行判斷RecyclerView不能為空並且接口對象(listener)不等於空,點擊事件才有用
        //8.2在點擊時我們要獲得這個position
        if(recvclerView!=null&&listnener!=null){
            int position=recvclerView.getChildAdapterPosition(v);
            listnener.onChildClick(recvclerView, v, position, list.get(position));
        }

    }

    /**
     * 4、添加點擊事件接口(與listview不同)
     */
    public interface OnChildClickListener{
        void onChildClick(RecyclerView parent,View view,int position,/*數據模型對象*/String data);

    }
    /**
     * 5、連接到RecyclerView,為RecyclerView綁定數據時執行的方法
     */
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        // TODO Auto-generated method stub
        super.onAttachedToRecyclerView(recyclerView);
        this.recvclerView=recyclerView;
    }
    /**
     * 6、與上面方法想對應,解綁的時候執行的方法
     */
    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        // TODO Auto-generated method stub
        super.onDetachedFromRecyclerView(recyclerView);
        this.recvclerView=null;
    }
}

在MainActivity中調用adapter的點擊事件運行

package com.example.recyclerview;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.os.Bundle;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {

    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);   
        //添加100條假數據
        List list=new ArrayList();
        for(int i=0;i<100;i++){
            list.add(String.format(Locale.CHINA, "第%03d條數據",i));
        }
        adapter=new MyAdapter(this, list);
        recycler.setAdapter(adapter);
        adapter.setOnChildClickListnener(this);
    }
    /**
     * 點擊事件
     */
    @Override
    public void onChildClick(RecyclerView parent, View view, int position,
            String data) {
        //將點擊的內容數據打印出來
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
    }

}

在adapter中添加增加和刪除數據的方法:

package com.example.recyclerview;

import java.util.List;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyAdapter extends RecyclerView.Adapter implements View.OnClickListener{

    private Context context;
    private Listlist;
    //4.1 創建接口對象
    private OnChildClickListener listnener;
    private RecyclerView recvclerView;

    //4.2 添加set監聽方法,以防止與系統重名,修改方法名setOnChildListnener
    public void setOnChildClickListnener(OnChildClickListener listnener) {
        this.listnener = listnener;
    }

    /**
     * 3、MyAdapter的構造方法添加構造方法
     */
    public MyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }
    /**
     * 1、編寫viewHolder:注意再listView當中我們編寫的viewHolder是我們自定義的,但是再RecyclerView
     * 中viewholder被規范化了,它需要繼承自RecyclerView的viewHolder,寫好自己的ViewHolder
     */
    public static class MyViewHolder extends RecyclerView.ViewHolder{

        private TextView text;
    /**
     * 2、編寫viewHolder的構造方法
     */
        public MyViewHolder(View itemView) {
            super(itemView);
            //2.1找到item中的text
            text=(TextView) itemView.findViewById(R.id.item_text);
        }


    }
    /**
     * 3、實現它的三個抽象方法
     */

    /**
     * 返回這個adpter中一共有多少條數據
     */
    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return list.size();
    }
    /**
     * 把現在的數據綁定到原有的viewHolder上
     */
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.text.setText(list.get(position));


    }
    /**
     * 相當於在listview中,onCreatView為空時,需要去創建viewHolder
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view=LayoutInflater.from(context).inflate(R.layout.item, parent,false);
    //7、由adapter去實現裡面的抽象方法
    view.setOnClickListener(this);

    return new MyViewHolder(view);
    }
    //8、抽象方法
    @Override
    public void onClick(View v) {
        //8.1為了安全起見我們首先進行判斷RecyclerView不能為空並且接口對象(listener)不等於空,點擊事件才有用
        //8.2在點擊時我們要獲得這個position
        if(recvclerView!=null&&listnener!=null){
            int position=recvclerView.getChildAdapterPosition(v);
            listnener.onChildClick(recvclerView, v, position, list.get(position));
        }

    }
    /**
     * 9、添加刪除的方法,從指定位置刪除
     */
    public void remove(int position){
        list.remove(position);
        /**
         * 9.1 刪除後提醒刷新
         * 注意:  調用notifyDataSetChanged();將無刪除特殊動畫效果
         */
        notifyItemRemoved(position);
    }

    /**
     * 4、添加點擊事件接口(與listview不同)
     */
    public interface OnChildClickListener{
        void onChildClick(RecyclerView parent,View view,int position,/*數據模型對象*/String data);

    }
    /**
     * 5、連接到RecyclerView,為RecyclerView綁定數據時執行的方法
     */
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        // TODO Auto-generated method stub
        super.onAttachedToRecyclerView(recyclerView);
        this.recvclerView=recyclerView;
    }
    /**
     * 6、與上面方法想對應,解綁的時候執行的方法
     */
    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        // TODO Auto-generated method stub
        super.onDetachedFromRecyclerView(recyclerView);
        this.recvclerView=null;
    }
}

MainActivity調用執行:

package com.example.recyclerview;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.os.Bundle;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {

    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);   
        //添加100條假數據
        List list=new ArrayList();
        for(int i=0;i<100;i++){
            list.add(String.format(Locale.CHINA, "第%03d條數據",i));
        }
        adapter=new MyAdapter(this, list);
        recycler.setAdapter(adapter);
        adapter.setOnChildClickListnener(this);
    }
    /**
     * 點擊事件
     */
    @Override
    public void onChildClick(RecyclerView parent, View view, int position,
            String data) {
        //將點擊的內容數據打印出來
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
        //調用刪除item方法
        adapter.remove(position);
    }

}

layoutManager的使用:

package com.example.recyclerview;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.os.Bundle;
import android.app.Activity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {

    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);   
        //添加100條假數據
        List list=new ArrayList();
        for(int i=0;i<100;i++){
            list.add(String.format(Locale.CHINA, "第%03d條數據",i));
        }
        adapter=new MyAdapter(this, list);

        /**
         * 在java代碼中使用LinearLayoutManager,不在布局文件中使用
         */
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);//(垂直水平,是否翻轉呈現布局)

        GridLayoutManager gridLayoutManager=new GridLayoutManager(this, 3);//(列數)

        //GridLayoutManager可以設置摸個item的樣式
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

            @Override
            public int getSpanSize(int position) {//占多少列
                if(position==0){
                    return 3; //第一行占三列
                }

                return 1;//默認占一列
            }
        });


        recycler.setLayoutManager(gridLayoutManager);//在xml布局中可以刪掉對linearLayoutManager的引用

        recycler.setAdapter(adapter);
        adapter.setOnChildClickListnener(this);
    }
    /**
     * 點擊事件
     */
    @Override
    public void onChildClick(RecyclerView parent, View view, int position,
            String data) {
        //將點擊的內容數據打印出來
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
        //調用刪除item方法
        adapter.remove(position);
    }

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved