Android新引入的RecyclerView用來代替ListView,但是RecyclerView處理點(diǎn)擊和長按事件卻沒有ListView方便
創(chuàng)新互聯(lián)建站專業(yè)提供成都主機(jī)托管四川主機(jī)托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價(jià)格,機(jī)房位于中國電信/網(wǎng)通/移動(dòng)機(jī)房,德陽服務(wù)器托管服務(wù)有保障!
RecyclerView并沒有onClickListener和onLongClickListener方法
這樣我們就需要在Adapter中創(chuàng)建一個(gè)接口
同時(shí)在adapter中創(chuàng)建該接口屬性
然后在adapter implements OnClickListener,View.OnLongClickListener,在方法onCreateViewHolder中,
在方法onBindViewHolder中,設(shè)置
特別注意:這里胡itemView即接受點(diǎn)擊事件的view,并不需要在ViewHolder中顯式地初始化,當(dāng)ViewHolder實(shí)例化之后,itemView也就自動(dòng)實(shí)例化了。
這樣我們?cè)赼dapter實(shí)現(xiàn)的onClick和onLongClick方法中,就可以
最后,在activity中實(shí)現(xiàn)接口OnRecyclerViewItemClickListener
即可實(shí)現(xiàn)點(diǎn)擊事件
xml文件代碼如下:
Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" /
Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2" /
四種方法分述如下:
匿名內(nèi)部類:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
}
});
}
}
自定義單擊事件監(jiān)聽類:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
class MyClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new MyClickListener());
btn2.setOnClickListener(new MyClickListener());
}
}
Activity繼承View.OnClickListener,由Activity實(shí)現(xiàn)OnClick(View view)方法,在OnClick(View view)方法中用switch-case對(duì)不同id代表的button進(jìn)行相應(yīng)的處理
public class TestButtonActivity extends Activity implements OnClickListener {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
最后一種是我今天看到的一種寫法,在XML文件中“顯示指定按鈕的onClick屬性,這樣點(diǎn)擊按鈕時(shí)會(huì)利用反射的方式調(diào)用對(duì)應(yīng)Activity中的click()方法”
Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button1" /
Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button2" /
這里在輸完android:的時(shí)候按下 Alt+/ 會(huì)有 onClick 屬性的提示, 但輸入到 android:onClick=“ 的地方按下 Alt+/ 并沒有提示 onClick 選項(xiàng),讓我突然覺得這里好像有點(diǎn)問題。
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
}
// 注意 這里沒有 @Override 標(biāo)簽
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
這種寫法整個(gè)代碼中都不用聲明button就可以實(shí)現(xiàn)button的單擊事件。
以上就是四種實(shí)現(xiàn)按鈕單擊事件的方法。
粗略總結(jié)一下,就是按鈕少的時(shí)候用匿名內(nèi)部類會(huì)比較快,比如寫demo測(cè)試的時(shí)候或者登陸界面之類的。
按鈕多的情況我還是選擇第三種方法,方便。
關(guān)于第四種方法,我感覺最方便,但看了很多代碼還是覺得寫法不夠大眾化,感興趣的朋友可以對(duì)此研究研究。相信會(huì)有不少收獲。
第一種點(diǎn)擊事件
在xml中設(shè)置onclick屬性
android:onClick="myOnclick"
第二種;獲取Button然后一個(gè)一個(gè)單獨(dú)綁定點(diǎn)擊事件
"
xmlns:tools=" "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"?
android:id="@+id/btn_imgBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="myOnclick"
android:text="imageButton"
/
android:id="@+id/btn_imgView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="myOnclick"
android:text="imageView"
/
public class MainActivity extends ActionBarActivity {
private Button btnImageBtn;
private Button btnImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_main);
? ? btnImageBtn = (Button) findViewById(R.id.btn_imgBtn);
? ? btnImageView = ?(Button) findViewById(R.id.btn_imgView);
btnImageBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "點(diǎn)擊ImageButton", Toast.LENGTH_SHORT).show();
}
});
? ? btnImageView.setOnClickListener(new MyListener());
}
第三種:寫一個(gè)類(MyListener)實(shí)現(xiàn)OnClickListener接口,然后Button在設(shè)置onclickListener的時(shí)候new一個(gè)MyListener
btnImageView.setOnClickListener(new MyListener());
class MyListener implements OnClickListener{
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_imgBtn:
Toast.makeText(MainActivity.this, "點(diǎn)擊ImageButton", Toast.LENGTH_SHORT).show();
break;
? ? ?case R.id.btn_imgView:
? ? ? Toast.makeText(MainActivity.this, "點(diǎn)擊imageView", Toast.LENGTH_SHORT).show();
break;
}?
第四種:整個(gè)類(MianActivity)實(shí)現(xiàn)onclickListener的接口
跳轉(zhuǎn)界面
Intent:意圖,用于訪問android中的組件
用Intent跳轉(zhuǎn)界面(activity)
第一步:new一個(gè)Intent()
Intent intent1 = new Intent(MainActivity.this,ImageButtonActivity.class);
startActivity(intent1);
public void myOnclick(View view){
?switch (view.getId()) {
case R.id.btn_imgBtn:
Intent intent1 = new Intent(MainActivity.this,ImageButtonActivity.class);
startActivity(intent1);
break;
? ? case R.id.btn_imgView:
? ? ?Intent intent2 = new Intent(MainActivity.this,ImageViewActivity.class);
startActivity(intent2);
break;
Intent intent = new Intent(當(dāng)前的activity,跳轉(zhuǎn)到的acticvity.class);
startActivity(intent);
3.ImageView
展示方式:scaleType:
4.ImageButton:
觸摸事件:當(dāng)控件或者屏幕唄觸摸的時(shí)候,產(chǎn)生的反應(yīng)
public boolean onTouchEvent(MotionEvent event) {
}
imageButton:現(xiàn)在已經(jīng)唄button代替,用于展示圖片的按鈕。不能顯示文字。
imageView
scaleType:圖片展示的方式
fitStart:展示在控件的上方
fitCenter:展示在控件的中間
fitEnd;展示在控件的下方
fitXY:不按照比例拉伸
matrix:矩陣模式
matrix可以設(shè)置圖片旋轉(zhuǎn),縮放。移動(dòng)
獲取圖片的高度和寬度
int h = imgView.getDrawable().getIntrinsicHeight();
int w = imgView.getDrawable().getIntrinsicWidth();
Matrix m = new Matrix();
m.postRotate(45);
m.postRotate(45, w/2, h/2);
imgView.setImageMatrix(m);
移動(dòng)事件:
按下:MotionEvent.ACTION_DOWN
抬起:MotionEvent.ACTION_UP
移動(dòng):MotionEvent.ACTION_MOVE
獲取當(dāng)前的移動(dòng)事件,
event.getAction()
"
xmlns:tools=" "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/img_01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/ss"
android:scaleType="fitXY"/
android:id="@+id/img_02"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/gl"
android:visibility="gone"
android:scaleType="fitXY"/
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bird"
android:layout_gravity="center"
/
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#ff0000"
android:gravity="center"
android:text="小鳥飛"/
public class MainActivity extends Activity {
private ImageView img01;
private ImageView img02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img01 = (ImageView) findViewById(R.id.img_01);
img02 = (ImageView) findViewById(R.id.img_02);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//System.out.println("被摸了");
if(event.getAction()==MotionEvent.ACTION_UP){
Log.v("TAG", "被抬起來");
if(img01.getVisibility()==View.VISIBLE){
img01.setVisibility(View.GONE);
img02.setVisibility(View.VISIBLE);
}else{
img01.setVisibility(View.VISIBLE);
img02.setVisibility(View.GONE);
}
}else if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.v("TAG", "被按下了");
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
Log.v("TAG", "移動(dòng)了");
}
return super.onTouchEvent(event);
}
源碼鏈接
效果圖
實(shí)現(xiàn)步驟:
1.在build.gradle文件中加入recyclerView庫
2.在main.xml中使用recyclerView布局
3.滾動(dòng)列表中的每一項(xiàng)對(duì)應(yīng)一個(gè)對(duì)象,他們屬于同一類的實(shí)例。接著定義實(shí)體類,我做的是歌單列表,定義序號(hào),名字和時(shí)長
4.設(shè)計(jì)列表項(xiàng)的樣式
4.使用適配器為列表項(xiàng)設(shè)置顯示的數(shù)據(jù)
4.1定義適配器的內(nèi)部類與列表項(xiàng)綁定
4.2適配器繼承自recyclerView.Adapter,要重寫三個(gè)方法,創(chuàng)建列表項(xiàng)視圖,復(fù)用加載,獲取列表項(xiàng)數(shù)量,到這一步,循環(huán)列表已經(jīng)可以實(shí)現(xiàn)滾動(dòng)效果了。
5.為列表項(xiàng)添加點(diǎn)擊監(jiān)聽事件,使用接口回調(diào)
5.1仍然是在適配器中,定義接口
5.2在onBindViewHolder中為列表項(xiàng)設(shè)置監(jiān)聽
5.3在MainActivity中使用,實(shí)現(xiàn)onclick方法
事情很簡單,一個(gè)返回按鈕設(shè)置了點(diǎn)擊事件,但是無論如何都觸發(fā)不了。
布局也很簡單,就是一個(gè) LinearLayout 中,包含一個(gè) TitleBar 和一個(gè) RecyclerView:
首先排除了一些小白錯(cuò)誤,確定了點(diǎn)擊事件確實(shí)綁定上了,但是卻無法點(diǎn)擊。
在網(wǎng)上搜索時(shí),看到有人說到一種情況,就是按鈕被上面的控件覆蓋了,導(dǎo)致點(diǎn)擊事件沒有傳遞過來。
但是,這個(gè)界面很簡單啊,不可能存在被覆蓋的情況吧?
雖然感覺問題不大,但是還是點(diǎn)開了 Layout Inspector 查看了實(shí)時(shí)布局。
不看不知道,一看嚇一跳:
原來他是一個(gè)透明的 ActionBar?這也太坑了吧!
找到問題就好解決了,直接隱藏了系統(tǒng)的 ActionBar 即可。
通過setOnClickListener()來綁定單擊事件 例如:Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click //增加自己的代碼...... 例如下面的 final TextView text = (TextView) findViewById(R.id.textView1); text.setText("OnClick. " + " ...."); } });
網(wǎng)站欄目:android點(diǎn)擊事件,android點(diǎn)擊事件處理
鏈接URL:http://muchs.cn/article26/phiocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站收錄、網(wǎng)站設(shè)計(jì)公司、微信小程序、Google、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)