本帖最后由 bdmh 于 2014-08-29 14:17:02 编辑

解决方案 »

  1.   

    trylistview.setFocusableInTouchMode(false);
      

  2.   

    模拟了下 你的实现  没发现 问题, 需要看看更多代码。另这种做法非常不推荐。  listview 有item重用机制的。
      

  3.   

    源码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>
      

  4.   

    我实际用到的不是button这么简单,是一个很复杂的layout,嵌入到listview的item中,这个类是动态创建的,要传入很多参数,所以是事先准备好的一个列表,每个对象里面的子元素都设置好了监听,如果每次getview中new,没办法传入参数
      

  5.   

    http://www.csharpwin.com/dotnetspace/5699r8629.shtml
    如何生成树形数据,可以百度“C# treeview 数据库”
      

  6.   

    ViewHolder
      

  7.   

    我想知道原因所在,为什么必须在getview中new,不管用什么holder,一样是要在getview中new过一次才能生效,否则无法点击
      

  8.   

    不是无法点击,你那代码我测试过,虽然不流畅但是也可以响应button的点击事件。
    如果你那边真的没有响应button点击事件,检查下是不是OnTouch被ListView拦截了,还是Button的Click事件和ListView的OnItemClick冲突了。