ListView中Button无法点击

bdmh
移动开发领域优质创作者
博客专家认证
2014-08-29 02:01:43
第一种情况:按钮可以点击
通过Adapter的getView中每次都new 一个Button

public View getView(final int position, View convertView, ViewGroup parent) {
Button view = new Button(getApplicationContext());
view.setTextColor(Color.RED);
view.setText(items.get(position));
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),items.get(position),Toast.LENGTH_SHORT).show();
}
});
convertView = view;
return convertView;
}

第二种情况:按钮不可以点击
实现new一个Button的列表,getview时每次取出对应的button

List<Button> buttons = new ArrayList<Button>();
//填充
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);
}
public View getView(final int position, View convertView, ViewGroup parent) {
Button view = buttons.get(position); //从列表中取出已经存在的Button
convertView = view;
return convertView;
}
}

这是什么原因,getview中new的button可以点击,取出已经存在的button不能点击
...全文
466 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartetc 2015-10-20
  • 打赏
  • 举报
回复
版主:您现在还是delphi版的版主吗。那边没有人关注了。我提了个问题也给您私信了。能否赐教。以前的程序是delphi的必须进行维护。谢谢您 http://bbs.csdn.net/topics/391843515
虫虫丿飞 2015-01-14
  • 打赏
  • 举报
回复
事件监听应该写在getView中
  • 打赏
  • 举报
回复
引用 12 楼 bdmh 的回复:
否则无法点击
不是无法点击,你那代码我测试过,虽然不流畅但是也可以响应button的点击事件。 如果你那边真的没有响应button点击事件,检查下是不是OnTouch被ListView拦截了,还是Button的Click事件和ListView的OnItemClick冲突了。
bdmh 2014-08-29
  • 打赏
  • 举报
回复
我想知道原因所在,为什么必须在getview中new,不管用什么holder,一样是要在getview中new过一次才能生效,否则无法点击
lionfresh 2014-08-29
  • 打赏
  • 举报
回复
是没有获取到焦点?
bdmh 2014-08-29
  • 打赏
  • 举报
回复
呵呵,8楼那个不要看,发错地了
  • 打赏
  • 举报
回复
引用 7 楼 bdmh 的回复:
我实际用到的不是button这么简单,是一个很复杂的layout,嵌入到listview的item中,这个类是动态创建的,要传入很多参数,所以是事先准备好的一个列表,每个对象里面的子元素都设置好了监听,如果每次getview中new,没办法传入参数
ViewHolder
bdmh 2014-08-29
  • 打赏
  • 举报
回复
http://www.csharpwin.com/dotnetspace/5699r8629.shtml 如何生成树形数据,可以百度“C# treeview 数据库”
bdmh 2014-08-29
  • 打赏
  • 举报
回复
我实际用到的不是button这么简单,是一个很复杂的layout,嵌入到listview的item中,这个类是动态创建的,要传入很多参数,所以是事先准备好的一个列表,每个对象里面的子元素都设置好了监听,如果每次getview中new,没办法传入参数
bdmh 2014-08-29
  • 打赏
  • 举报
回复
源码

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>

licai1210 2014-08-29
  • 打赏
  • 举报
回复
版主你贴出所有源码吧?或者你用一个最简单的例子试试。你这个是没问题的
老科达 2014-08-29
  • 打赏
  • 举报
回复
模拟了下 你的实现 没发现 问题, 需要看看更多代码。 另这种做法非常不推荐。 listview 有item重用机制的。
bdmh 2014-08-29
  • 打赏
  • 举报
回复
引用 2 楼 hjywyj 的回复:
try listview.setFocusableInTouchMode(false);
没用的
  • 打赏
  • 举报
回复
try listview.setFocusableInTouchMode(false);
  • 打赏
  • 举报
回复
版主好

80,472

社区成员

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

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