ListView中Button无法点击 本帖最后由 bdmh 于 2014-08-29 14:17:02 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 trylistview.setFocusableInTouchMode(false); 模拟了下 你的实现 没发现 问题, 需要看看更多代码。另这种做法非常不推荐。 listview 有item重用机制的。 源码package com.myapplication2.app;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.datadecoder.decoder.*;import com.stock.data.Stock;import com.stock.listening.CustomListening;import com.stock.listening.EventArgs;import com.stock.view.KLineView;import com.stock.view.StockView;import java.text.DecimalFormat;import java.text.NumberFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class MainActivity extends ActionBarActivity { ListView listView; List<Button> buttons = new ArrayList<Button>(); List<String> items = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView)findViewById(R.id.listView); listView.setFocusableInTouchMode(false); Button btn_ShowData = (Button)findViewById(R.id.btn_showdata); btn_ShowData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fillItems(); TestAdapter adapter = new TestAdapter(getApplicationContext()); listView.setAdapter(adapter); } }); Button btn_Test = (Button)findViewById(R.id.btn_Test); btn_Test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listView.scrollListBy(100); } }); for(int i=0;i<50;i++){ final Button btn = new Button(getApplicationContext()); btn.setText("Button "+String.valueOf(i+1)); btn.setTextColor(Color.RED); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),btn.getText(),Toast.LENGTH_SHORT).show(); } }); buttons.add(btn); } } private void fillItems(){ items.clear(); for(int i=1;i<=50;i++){ items.add("Item "+String.valueOf(i)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private class TestAdapter extends BaseAdapter { private Context _context; public TestAdapter(Context context){ _context = context; } public int getCount(){ return items.size(); } @Override public boolean isEnabled(int position) { return true; } 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 parent) { Button view = buttons.get(position); convertView = view; return convertView; } }}布局文件<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="com.myapplication2.app.MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="false" android:id="@+id/linearLayout"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="show data" android:id="@+id/btn_showdata" android:textSize="10dp" android:minHeight="1dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn_Test" android:id="@+id/btn_Test" android:textSize="10dp" android:minHeight="1dp" /> </LinearLayout> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:layout_alignParentBottom="true" android:layout_alignStart="@+id/linearLayout" android:layout_below="@+id/linearLayout" /></RelativeLayout> 我实际用到的不是button这么简单,是一个很复杂的layout,嵌入到listview的item中,这个类是动态创建的,要传入很多参数,所以是事先准备好的一个列表,每个对象里面的子元素都设置好了监听,如果每次getview中new,没办法传入参数 http://www.csharpwin.com/dotnetspace/5699r8629.shtml如何生成树形数据,可以百度“C# treeview 数据库” 用ViewHolder啊 我想知道原因所在,为什么必须在getview中new,不管用什么holder,一样是要在getview中new过一次才能生效,否则无法点击 不是无法点击,你那代码我测试过,虽然不流畅但是也可以响应button的点击事件。如果你那边真的没有响应button点击事件,检查下是不是OnTouch被ListView拦截了,还是Button的Click事件和ListView的OnItemClick冲突了。 关于gridview android 程序的联机帮助 android上的播放器,一般怎么输出视频?surface android的service是和activity同线程吗 如何获取wma、mp3等音乐文件的采样率、比特率等信息? 如何提高android代码的安全性 Android短信功能实现源码 Android 模拟器中SD卡文件读写问题 手机插入USB时自动安装APK的问题 Android webview + html 性能问题 如何向Viewpager里动态添加fragment,从网络获取数据实现左右滑动? java怎么获取到全国的电视节目单,滚求!!!!!!!
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import com.datadecoder.decoder.*;
import com.stock.data.Stock;
import com.stock.listening.CustomListening;
import com.stock.listening.EventArgs;
import com.stock.view.KLineView;
import com.stock.view.StockView;import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends ActionBarActivity { ListView listView;
List<Button> buttons = new ArrayList<Button>();
List<String> items = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
listView.setFocusableInTouchMode(false);
Button btn_ShowData = (Button)findViewById(R.id.btn_showdata);
btn_ShowData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fillItems();
TestAdapter adapter = new TestAdapter(getApplicationContext());
listView.setAdapter(adapter);
}
});
Button btn_Test = (Button)findViewById(R.id.btn_Test);
btn_Test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listView.scrollListBy(100);
}
});
for(int i=0;i<50;i++){
final Button btn = new Button(getApplicationContext());
btn.setText("Button "+String.valueOf(i+1));
btn.setTextColor(Color.RED);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),btn.getText(),Toast.LENGTH_SHORT).show();
}
});
buttons.add(btn);
}
} private void fillItems(){
items.clear();
for(int i=1;i<=50;i++){
items.add("Item "+String.valueOf(i));
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} private class TestAdapter extends BaseAdapter {
private Context _context;
public TestAdapter(Context context){
_context = context;
}
public int getCount(){
return items.size();
}
@Override
public boolean isEnabled(int position) {
return true;
}
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 parent) {
Button view = buttons.get(position);
convertView = view;
return convertView;
}
}}布局文件<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="com.myapplication2.app.MainActivity"> <LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="false"
android:id="@+id/linearLayout"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="show data"
android:id="@+id/btn_showdata"
android:textSize="10dp"
android:minHeight="1dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="btn_Test"
android:id="@+id/btn_Test"
android:textSize="10dp"
android:minHeight="1dp" />
</LinearLayout> <ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/linearLayout"
android:layout_below="@+id/linearLayout" /></RelativeLayout>
如何生成树形数据,可以百度“C# treeview 数据库”
如果你那边真的没有响应button点击事件,检查下是不是OnTouch被ListView拦截了,还是Button的Click事件和ListView的OnItemClick冲突了。