1. 程式人生 > >安卓開發 RecyclerView的點選事件

安卓開發 RecyclerView的點選事件

新增必備依賴:

compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.jakewharton:butterknife:7.0.1'//Android View設計的繫結註解

xml:(Recyclerview控制元件)

<?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="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

新建一個介面:
public interface SuperOnclick {
    void RVOnclick(View view, int postsion);
}

新建介面卡:

public class SuperAdapter extends RecyclerView.Adapter<SuperAdapter.Viewholder> implements View.OnClickListener {
    Context context;
    String[] strings;

    SuperOnclick superOnclick = null;

    public SuperAdapter(Context context, String[] strings) {
        this.context = context;
        this.strings = strings;
    }

    //在onCreateViewHolder()中為每個item新增點選事件
    @Override
    public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        Viewholder viewholder = new Viewholder(view);
        //將建立的View註冊點選事件
        view.setOnClickListener(this);
        return viewholder;
    }

    @Override
    public void onBindViewHolder(Viewholder holder, int position) {
        holder.textView.setText(strings[position]);
        //將position儲存在itemView的Tag中,以便點選時進行獲取
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        return strings.length;
    }

    @Override
    public void onClick(View v) {
        if (superOnclick != null) {
            //注意這裡使用getTag方法獲取position
            superOnclick.RVOnclick(v, (int) v.getTag());
        }
    }

    //最後暴露給外面的呼叫者,定義一個設定Listener的方法
    public void setonclick(SuperOnclick superOnclick) {
        this.superOnclick = superOnclick;
    }

    class Viewholder extends RecyclerView.ViewHolder {
        TextView textView;

        public Viewholder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textview);
        }
    }
}

介面卡用的xml :LineraLayout 包裹 TextView

主頁面:

public class MainActivity extends AppCompatActivity {
    Context context = MainActivity.this;
    String[] strings = {"1", "2", "3", "4", "5"};

    SuperAdapter superAdapter;

    @Bind(R.id.recyclerview)
    RecyclerView recyclerview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        recyclerview.setLayoutManager(new LinearLayoutManager(this));
        superAdapter=new SuperAdapter(MainActivity.this,strings);
        recyclerview.setAdapter(superAdapter);
        
        superAdapter.setonclick(new SuperOnclick() {
            @Override
            public void RVOnclick(View view, int postsion) {
                Toast.makeText(context, "點選是=" + strings[postsion], Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Demo截圖: