我的一个ListView数据绑定用的是BaseAdapter,
但是就是无法选中某一行!怎么办!怎么办!请各位前辈帮忙看看!
package test.com;import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;public class ListItemClick extends Activity{ ListView list01;
private DataBaseAdapter mMyAdapter;

String[] msgFirst1={
"01 第一行内容","02 第一行内容","03 第一行内容","04 第一行内容","05 第一行内容",
"06 第一行内容","07 第一行内容","08 第一行内容","09 第一行内容","10 第一行内容"};
String[] msgSecond1={
"01 第二行内容","02 第二行内容","03 第二行内容","04 第二行内容","05 第二行内容",
"06 第二行内容","07 第二行内容","08 第二行内容","09 第二行内容","10 第二行内容"};
@Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.listitem);

list01=(ListView)findViewById(R.id.list01);

     mMyAdapter = new DataBaseAdapter();
        list01.setAdapter(mMyAdapter);
        
list01.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(ListItemClick.this, arg2, Toast.LENGTH_LONG).show();
//打断点也进入不了这行!
}
}); }

    public class DataBaseAdapter extends BaseAdapter 
    {
        /*ImageAdapter的构造符*/
        public DataBaseAdapter() 
        {
        }
@Override
public int getCount() {
return msgFirst1.length;
} /*一定要重写的方法getItem,传回position*/
@Override
public Object getItem(int position) {
return position;
}  /*一定要重写的方法getItemId,传并position*/
@Override
public long getItemId(int position) {
return position;
} /*几定要重写的方法getView,传并几View对象*/
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view;
view = getLayoutInflater().inflate(R.layout.list_linearlayout, null);
try {
ReferenceHolder holder = new ReferenceHolder(); holder.text1=(TextView)view.findViewById(R.id.txtLink1);//初始化TextView
holder.text2=(TextView)view.findViewById(R.id.txtLink2);//初始化TextView
holder.button=(Button)view.findViewById(R.id.btSelect01);//初始化Button
view.setTag(holder);

holder.text1.setText(msgFirst1[position]);//设置内容
holder.text1.setTextSize(16);//设置字体大小
holder.text1.setTextColor(Color.WHITE);//设置字体颜色

holder.text2.setText(msgSecond1[position]);//设置内容
holder.text2.setTextSize(16);//设置字体大小
holder.text2.setTextColor(Color.WHITE);//设置字体颜色

holder.button.setText("下载"); } catch (Exception e) {
Toast.makeText(ListItemClick.this, e.getMessage(),Toast.LENGTH_LONG).show();
}
            return view;
}
    }
    class ReferenceHolder {          public TextView text1; 
     public TextView text2;
     public Button button;
     public LinearLayout layout;
    }}list_linearlayout.xml<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:id="@+id/imageView01" android:layout_width="35.0dip"
android:layout_height="40.0dip" android:scaleType="fitCenter"
android:layout_alignParentLeft="true" />
<TextView android:id="@+id/txtLink1"
android:paddingLeft="6.0dip" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView01" />
<TextView android:id="@+id/txtLink2"
android:paddingLeft="6.0dip" android:paddingBottom="8.0dip"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="-4.0dip" android:layout_toRightOf="@id/imageView01"
android:layout_below="@id/txtLink1" />
<TextView android:id="@+id/txtLink3"
android:paddingLeft="6.0dip" android:paddingBottom="8.0dip"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="-4.0dip" android:layout_toRightOf="@id/imageView01"
android:layout_below="@id/txtLink1" android:visibility="gone" />
<ImageView android:id="@+id/imageView02" android:layout_width="35.0dip"
android:layout_height="40.0dip" android:layout_marginLeft="180px" android:scaleType="fitCenter"
android:layout_alignParentLeft="true" android:layout_toRightOf="@id/imageView01"  />
<Button android:id="@+id/btSelect01"
android:layout_marginLeft="230px" android:paddingBottom="4.0dip" 
android:layout_width="wrap_content" android:layout_height="wrap_content" 
android:layout_toRightOf="@id/imageView01" />
</RelativeLayout>listitem.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView 
android:id="@+id/list01" 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:drawSelectorOnTop="false"
android:scrollbars="vertical" />
</LinearLayout>

解决方案 »

  1.   

           /*一定要重写的方法getItem,传回position*/
            @Override
            public Object getItem(int position) {
                return position;
            }这个地方你改一下试试:return msgFirst1[position];
      

  2.   

    重写ListActivity的此方法,在这个方法里面处理item的点击事件        @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    }应该可以解决问题
      

  3.   

    回复2楼 我重写了!但是还是没有反应!
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            // TODO Auto-generated method stub
            super.onListItemClick(l, v, position, id);
            Toast.makeText(ListMainActivity.this, position, Toast.LENGTH_LONG).show();
        }
      

  4.   

    回复1、2楼!方法我都试验过了!!!都不行!ListView跟死了一样!死了一样的沉闷!
      

  5.   

    晕~~~ onListItemClick都不行onclick 更不行了!5楼前辈您看在我的代码哪里能加你的onclick可以执行!
      

  6.   

    把buttonqu去掉就行了,是因为Button拦截了listview的onListItemClick事件
      

  7.   

    原因就是Button的onListItemClick优先级高于ListView导致的,list01.setOnItemClickListener(new OnItemClickListener()会使整个View上都该事件,你可以试一下,将Button和Listview的View分开
      

  8.   

    你把getView再改一下试试: @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ReferenceHolder holder;
    if (view == null){

    view = getLayoutInflater().inflate(R.layout.list_linearlayout, null);
    holder = new ReferenceHolder();
                    holder.text1=(TextView)view.findViewById(R.id.txtLink1);//初始化TextView
                    holder.text2=(TextView)view.findViewById(R.id.txtLink2);//初始化TextView
                    holder.button=(Button)view.findViewById(R.id.btSelect01);//初始化Button
                    view.setTag(holder);

    } else {
    holder = (ReferenceHolder) view.getTag();
    }

                    holder.text1.setText(msgFirst1[position]);//设置内容
                    holder.text1.setTextSize(16);//设置字体大小
                    holder.text1.setTextColor(Color.WHITE);//设置字体颜色
                    
                    holder.text2.setText(msgSecond1[position]);//设置内容
                    holder.text2.setTextSize(16);//设置字体大小
                    holder.text2.setTextColor(Color.WHITE);//设置字体颜色
        
                    holder.button.setText("下载");

    return view;
    }
      

  9.   

    有错别字:把Button去掉就行了,是因为Button拦截了listview的onListItemClick事件
      

  10.   

    要是一定要有Button怎么办那!!这是我目前改的结果!还是没有任何反应!
    package test.com;import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    public class ListItemClick extends Activity{ ListView list01;
    private DataBaseAdapter mMyAdapter;

    String[] msgFirst1={
    "01 第一行内容","02 第一行内容","03 第一行内容","04 第一行内容","05 第一行内容",
    "06 第一行内容","07 第一行内容","08 第一行内容","09 第一行内容","10 第一行内容"};
    String[] msgSecond1={
    "01 第二行内容","02 第二行内容","03 第二行内容","04 第二行内容","05 第二行内容",
    "06 第二行内容","07 第二行内容","08 第二行内容","09 第二行内容","10 第二行内容"};
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listitem);

    list01=(ListView)findViewById(R.id.list01);

         mMyAdapter = new DataBaseAdapter();
            list01.setAdapter(mMyAdapter);
            
    list01.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1,
    int arg2, long arg3) {
    Toast.makeText(ListItemClick.this, arg2, Toast.LENGTH_LONG).show();
    //打断点也进入不了这行!
    }
    }); }

        public class DataBaseAdapter extends BaseAdapter
        {
            /*ImageAdapter的构造符*/
            public DataBaseAdapter() 
            {
            }
    @Override
    public int getCount() {
    return msgFirst1.length;
    } /*一定要重写的方法getItem,传回position*/
    @Override
    public Object getItem(int position) {
    return position;
    }  /*一定要重写的方法getItemId,传并position*/
    @Override
    public long getItemId(int position) {
    return position;
    } /*几定要重写的方法getView,传并几View对象*/
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
    View view = convertView;
    ReferenceHolder holder;

    try {

    if (view == null)
    {
    view = getLayoutInflater().inflate(R.layout.list_linearlayout, null);
    holder = new ReferenceHolder();
    holder.text1=(TextView)view.findViewById(R.id.txtLink1);//初始化TextView
    holder.text2=(TextView)view.findViewById(R.id.txtLink2);//初始化TextView
    holder.button=(Button)view.findViewById(R.id.btSelect01);//初始化Button
    view.setTag(holder); } else {
    holder = (ReferenceHolder) view.getTag();
    } holder.text1.setText(msgFirst1[position]);//设置内容
    holder.text1.setTextSize(16);//设置字体大小
    holder.text1.setTextColor(Color.WHITE);//设置字体颜色

    holder.text2.setText(msgSecond1[position]);//设置内容
    holder.text2.setTextSize(16);//设置字体大小
    holder.text2.setTextColor(Color.WHITE);//设置字体颜色

    holder.button.setText("下载");
    holder.layout=(RelativeLayout)view.findViewById(R.id.layout01); if (position % 2 == 0){
    holder.layout.setBackgroundColor(Color.BLUE);
    }else{
    holder.layout.setBackgroundColor(Color.GREEN);
    }
    } catch (Exception e) {
    Toast.makeText(ListItemClick.this, e.getMessage(),Toast.LENGTH_LONG).show();
    }
                return view;
    }    }
        class ReferenceHolder {          public TextView text1; 
         public TextView text2;
         public Button button;
         public RelativeLayout layout;
        }}
      

  11.   

    我建议lz把下载功能写在每个item的长按事件里面
      

  12.   

    我下班回家了,试不了,你可以试下将具Button的android:focusable属性置成false看看能不能行
      

  13.   

    参考这个看一下http://blogold.chinaunix.net/u2/85193/showart_2435431.html
      

  14.   

    listView 和 Button 冲突的问题不是第一次看到了,把Button 的focusable 属性设置为false。
     android:focusable="false"
      

  15.   

    在贴出代码!已经照13楼至16楼前辈改了Button按钮的android:focusable="false"和<RelativeLayout>中android:descendantFocusability="blocksDescendants"
    但是还是没反应啊!!
    package test.com;import android.app.ListActivity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;public class ListViewActivity extends ListActivity { private DataBaseAdapter mMyAdapter;

    String[] msgFirst1={
    "01 第一行内容","02 第一行内容","03 第一行内容","04 第一行内容","05 第一行内容",
    "06 第一行内容","07 第一行内容","08 第一行内容","09 第一行内容","10 第一行内容"};
    String[] msgSecond1={
    "01 第二行内容","02 第二行内容","03 第二行内容","04 第二行内容","05 第二行内容",
    "06 第二行内容","07 第二行内容","08 第二行内容","09 第二行内容","10 第二行内容"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);        // 关联Layout中的ListView
            ListView vncListView = (ListView)findViewById(android.R.id.list);
            mMyAdapter = new DataBaseAdapter();
            vncListView.setAdapter(mMyAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    l.setBackgroundColor(Color.RED);//不管用!不管用!啊!!!
    l.getItemAtPosition(position);
    }

    public class DataBaseAdapter extends BaseAdapter
        {
            public DataBaseAdapter() 
            {
            }
    @Override
    public int getCount() {
    return msgFirst1.length;
    } @Override
    public Object getItem(int position) {
    return position;
    } @Override
    public long getItemId(int position) {
    return position;
    } @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
    View view = convertView;
                ReferenceHolder holder;
                
                try {            
                    
                    if (view == null)
                    {
                        view = getLayoutInflater().inflate(R.layout.list_linearlayout, null);
                        holder = new ReferenceHolder();
                        holder.text1=(TextView)view.findViewById(R.id.txtLink1);//初始化TextView
                        holder.text2=(TextView)view.findViewById(R.id.txtLink2);//初始化TextView
                        holder.button=(Button)view.findViewById(R.id.btSelect01);//初始化Button
                        view.setTag(holder);                } else {
                        holder = (ReferenceHolder) view.getTag();
                    }                holder.text1.setText(msgFirst1[position]);//设置内容
                    holder.text1.setTextSize(16);//设置字体大小
                    holder.text1.setTextColor(Color.WHITE);//设置字体颜色
                    
                    holder.text2.setText(msgSecond1[position]);//设置内容
                    holder.text2.setTextSize(16);//设置字体大小
                    holder.text2.setTextColor(Color.WHITE);//设置字体颜色
        
                    holder.button.setText("下载");
                    final int row_num=position;
                    holder.button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(ListViewActivity.this,"点击第 "+row_num+" 行!",Toast.LENGTH_LONG).show();

    }
    });
                 
                    holder.layout=(RelativeLayout)view.findViewById(R.id.layout01);                if (position % 2 == 0){
                        holder.layout.setBackgroundColor(Color.BLUE);
                    }else{
                        holder.layout.setBackgroundColor(Color.GREEN);
                    }
                    } catch (Exception e) {
                    Toast.makeText(ListViewActivity.this, e.getMessage(),Toast.LENGTH_LONG).show();
                }
                return view; }
        }
        class ReferenceHolder {          public TextView text1; 
         public TextView text2;
         public Button button;
         public RelativeLayout layout;
        }
    }
    list_linearlayout.xml<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout android:layout_width="fill_parent" android:id="@+id/layout01"
        android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" 
        xmlns:android="http://schemas.android.com/apk/res/android">
        <ImageView android:id="@+id/imageView01" android:layout_width="35.0dip"
            android:layout_height="40.0dip" android:scaleType="fitCenter"
            android:layout_alignParentLeft="true" />
        <TextView android:id="@+id/txtLink1"
            android:paddingLeft="6.0dip" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView01" />
        <TextView android:id="@+id/txtLink2"
            android:paddingLeft="6.0dip" android:paddingBottom="8.0dip"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_marginTop="-4.0dip" android:layout_toRightOf="@id/imageView01"
            android:layout_below="@id/txtLink1" />
        <TextView android:id="@+id/txtLink3"
            android:paddingLeft="6.0dip" android:paddingBottom="8.0dip"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_marginTop="-4.0dip" android:layout_toRightOf="@id/imageView01"
            android:layout_below="@id/txtLink1" android:visibility="gone" />
        <ImageView android:id="@+id/imageView02" android:layout_width="35.0dip"
            android:layout_height="40.0dip" android:layout_marginLeft="180px" android:scaleType="fitCenter"
            android:layout_alignParentLeft="true" android:layout_toRightOf="@id/imageView01"  />
        <Button android:id="@+id/btSelect01"
            android:layout_marginLeft="230px" android:paddingBottom="4.0dip" 
            android:layout_width="wrap_content" android:layout_height="wrap_content" 
            android:focusable="false" android:layout_toRightOf="@id/imageView01" />
    </RelativeLayout>
      

  16.   

    解决了!v.setBackgroundColor(Color.RED);
      

  17.   

    这个就是listview和按钮view接收事件的先后顺序问题,网上有很多这个问题的介绍。
    自定义ListView的ListItem的布局时,如果布局中有多选,单选,或者button时,必须设置布局属性android:descendantFocusability="blocksDescendants"并且把按钮的onfoucus属性设置为false,不然Listitem的onclick事件将失效,应为Listitem的onclick事件优先级低于button的onclick事件。
    恭喜楼主解决问题。
      

  18.   

    还有一个新问题!在点击事件里,怎么获得这一行!TextView里的内容!
    @Override
    protected void onListItemClick(ListView arg0, View v, int position, long id) {
    super.onListItemClick(arg0, v, position, id);
    arg0.getItemAtPosition(position);
    //怎么获得列表里的TextView内容那!或者绑定的数据内容
    Toast.makeText(ListViewActivity.this,"点击第 "+(position+1)+" 行!",Toast.LENGTH_SHORT).show();
    }
      

  19.   

    参数View v就是点击的list item吧,然后取得子view就可以。
    或者,知道当前点击的position,再取得第一个可见的item位置,通过两者之差,找到相对index,然后通过listview的getChildAt(index)也可以找到你的TextView,参考。
    int visStart = listMusic.getFirstVisiblePosition();
    int visEnd = listMusic.getLastVisiblePosition();
    TextView tvTitle, tvSinger, tvTextt;
    int index = position - visStart;
    if ( index >= 0 && index <= visEnd - visStart) {
    tvTitle = (TextView)(listMusic.getChildAt(index).findViewById(R.id.ItemTitle));
      

  20.   

    非常感谢!!我用一下方法也解决了!还是好人多啊!
    Toast.makeText(ListViewActivity.this,"您选择的是: "+ msgFirst1[position],Toast.LENGTH_SHORT).show();
      

  21.   

      public View getView(int position, View convertView, ViewGroup parent)
            {
                View view = super.getView(position,convertView,parent)             holder.text1=(TextView)view.findViewById(R.id.txtLink1);//初始化TextView}