导致fragment 下listview.setOnItemClickListener() 无效的原因(之一)

hosea_liu 2014-04-18 11:12:18
前日发帖,《求助: fragment 下listview.setOnItemClickListener() 无效 》
在main Activity中用fragment 实现了一个tab(tab1),tab1 中用listview显示数据,listview中每行的layout 有单独xml定义。
1.xml部分代码
1.1 ,main.xml中tabhost部分的定义
<TabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment android:name="省略"
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</TabHost>

1.2.tab1的xml定义
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >

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

1.3.listview 中每行的xml定义
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget32"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:descendantFocusability="blocksDescendants"
android:focusable="true"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/listImageView"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_weight="1"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:src="@android:drawable/btn_star" />
<LinearLayout
android:id="@+id/widget34"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="9"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/widget35"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_weight="9"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:orientation="horizontal">
<TextView
android:id="@+id/textListInfo1"
android:layout_width="fill_parent"
android:layout_weight="3"
android:layout_height="25dp"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:text="家电 等" />
</LinearLayout>
<LinearLayout
<TextView
android:id="@+id/textListInfo2"
android:layout_width="fill_parent"
android:layout_weight="3"
android:layout_height="25dp"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:text="机器 等" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

2.java代码
2.1 main Activity
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

setupViews();
}
private void setupViews() {
TabHost tabhost = (TabHost) findViewById(android.R.id.tabhost);
tabhost.setup();
tabhost.addTab(tabhost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.tab1));
tab_fragment1 tab1 = new tab_fragment1();
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(tab1, "tab1");

ft.commit();
}
2.1 tab1代码
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
Log.v("MyFragment1","OnCreateView.......");
View v = inflater.inflate(R.layout.activity_tab_fragment1, container,false);
listView = (ListView) v.findViewById(R.id.listView1);
adapter = new LoaderAdapter(10, v.getContext(),R.layout.activity_ent001000_list_item, URLS);
listView.setAdapter(adapter);
listView.setOnScrollListener(mScrollListener);
listView.setClickable(true);
listView.setOnItemClickListener(mItemClickListener);
return v;

}
OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener()
{

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
listView.getSelectedView().setBackgroundColor(Color.GRAY);
System.out.println("你点击的是第" + arg3 + "项");
}

};

在虚拟机上运行后,鼠标点在listview的明细上没有任何反应也么有报错信息,在onitemclick中设的断点也走不进去
在网上找了很多的解决办法但是都不灵,今天看到网上有人说导致无效的原因是因为在定义每layout的xml中,LinearLayout的clickable属性被设成true,
将上面的
1.3.listview 中每行的xml定义
<LinearLayout
android:id="@+id/widget34"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="9"
android:focusable="true" ===>>> android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:orientation="vertical" >
后,setOnItemClickListener被调用,给被困扰的同学们参考。
原文地址
http://stackoverflow.com/questions/15624859/listfragment-onlistitemclick-ignoring-me-not-focusable-views
...全文
142 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
package com.alva.vcd; import java.util.ArrayList; import java.util.List; import com.alva.vcd.adapter.RecorderAdapter; import com.alva.vcd.pojo.Recorder; import com.alva.vcd.view.AudioRecorderButton; import com.alva.vcd.view.AudioRecorderButton.AudioFinishRecorderListener; import com.alva.vcd.view.MediaManager; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.graphics.drawable.AnimationDrawable; import android.media.MediaPlayer; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.TextView; import android.os.Build; public class MainActivity extends Activity implements AudioFinishRecorderListener, OnItemClickListener { private ListView mListview; private AudioRecorderButton mAudioButton; private ArrayAdapter mAdapter; private List mDatas = new ArrayList();; private View mAnimView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); initViews(); initDatas(); initEvents(); } private void initViews() { mListview = (ListView) findViewById(R.id.listview_chat); mAudioButton = (AudioRecorderButton) findViewById(R.id.recorderButton); } private void initDatas() { mAudioButton.setAudioFinishRecorderListener(this); mAdapter = new RecorderAdapter(getApplicationContext(), mDatas); mListview.setAdapter(mAdapter); } private void initEvents() { mListview.setOnItemClickListener(this); } @Override public void onFinsh(float seconds, String filePath) { Recorder mRecorder = new Recorder(); mRecorder.setFilePath(filePath); mRecorder.setTime(seconds); mDatas.add(mRecorder); mAdapter.notifyDataSetChanged(); mListview.setSelection(mDatas.size() - 1); } @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { Log.e("MediaManager", mDatas.get(arg2).getFilePath() + "sssss"); if (mAnimView != null) { mAnimView.setBackgroundResource(R.drawable.adj); mAnimView = null; } // 播放动画 mAnimView = arg1.findViewById(R.id.id_view); mAnimView.setBackgroundResource(R.drawable.play_anim); AnimationDrawable anim = (AnimationDrawable) mAnimView.getBackground(); anim.start(); // 播放音频 MediaManager.playSound(mDatas.get(arg2).getFilePath(), new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer arg0) { mAnimView.setBackgroundResource(R.drawable.adj); } }); } @Override protected void onPause() { super.onPause(); MediaManager.pause(); } @Override protected void onResume() { super.onResume(); MediaManager.resume(); } @Override protected void onDestroy() { super.onDestroy(); MediaManager.release(); } }

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧