【问题标题】:ListView setOnItemClickListener not working in custom list viewListView setOnItemClickListener 在自定义列表视图中不起作用
【发布时间】:2014-03-28 06:31:34
【问题描述】:

我有一个列表视图,每行有两个文本视图和一个编辑文本,列表视图 setOnItemClickListener() 不起作用。

这是我的 Java 代码。

public class CreateChallan extends Activity {


ListView lstCreate;

String[] strmainItemCode;
String[] strItem;
String[] strQuantity;
Context context=this;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.createchallan);
    lstCreate= (ListView) findViewById(R.id.createlist);
    lstCreate.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);

    strmainItemCode= new String[]{"555551","255555","355555","455555","555555"};

    strItem =new String[]{"A","B","C","D","F"};

    strQuantity =new String[]{"100","200","30","400","500"};

    CreateAdapter adapter= new CreateAdapter(this, strmainItemCode, strItem, s trQuantity);

    lstCreate.setAdapter(adapter);

    lstCreate.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position1, long id) {
            // TODO Auto-generated method stub

            Toast.makeText(context, "Position",   Toast.LENGTH_LONG).show();

        }
    });
}







// Create List Adapter

class CreateAdapter extends ArrayAdapter<String>
 {
    TextView txtItecode, txtItem;
    EditText editQuantity;
    String[] strItecode;
    String[] strItem;
    String[] strQuantity;
    Context context;

    CreateAdapter(Context context, String[] strItemcode, String[] strItem,  String[] strQauntity)
    {
           super(context,R.layout.create_list_item,R.id.txtItemcode,strItemcode);
        this.context= context;
        this.strItecode= strItemcode;
        this.strItem= strItem;
        this.strQuantity= strQauntity;
    }
     public View getView(int position, View convertView, ViewGroup parent) {
         LayoutInflater mInflater = (LayoutInflater)  context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
         View row;
         row=mInflater.inflate(R.layout.create_list_item, parent,false);

         txtItecode= (TextView) row.findViewById(R.id.txtItemcode);
         txtItem =(TextView) row.findViewById(R.id.txtItem);
         editQuantity = (EditText)  row.findViewById(R.id.editcreateQuantity);

         txtItecode.setText(strItecode[position]);
         txtItem.setText(strItem[position]);
        editQuantity.setText(strQuantity[position]);

         txtItecode.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "click", Toast.LENGTH_LONG).show();
            }
        });

         return row;


     }
 }


}

这里是我的清单 xml 代码

 <ListView
    android:id="@+id/createlist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
   android:clickable="true"
    android:cacheColorHint="#00000000"
    android:divider="#adb8c2"
    android:dividerHeight="1dp"
    android:scrollingCache="false"
    android:smoothScrollbar="true" 
    android:focusable="false"
android:focusableInTouchMode="false"

   >

</ListView>

请建议我如何解决这个问题。

提前致谢

【问题讨论】:

  • 你想在listview中写两次点击监听
  • 我发布了自定义适配器,它本身具有 onitem click 和 onclick 功能,因此您无需在外部编写它只需尝试,您只需将 on item 点击到 convertview 点击功能

标签: android android-layout android-listview


【解决方案1】:

设置这些属性

 android:focusable="false"
 android:focusableInTouchMode="false"

create_list_item xml 文件中的所有 UI 元素。

同时从 ListView 中删除该属性。

所以你的 ListView 将是

 <ListView
   android:id="@+id/createlist"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:clickable="true"
   android:cacheColorHint="#00000000"
   android:divider="#adb8c2"
   android:dividerHeight="1dp"
   android:scrollingCache="false"
   android:smoothScrollbar="true">
 </ListView>

【讨论】:

  • 这是可行的,但是对于有问题的“视图”,属性android: clickable 必须为假。注意“View”的父母不要使用“android:clickable”。这将阻止您的列表或衍生产品的模式选择器。您可以使用属性android: foreground 将模式选择器与自定义选择器匹配,如下所示:&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:fitsSystemWindows="true"&gt; &lt;FrameLayout "android: foreground="CUSTOM SELECTOR""&gt; &lt;RelativeLayout&gt;&lt;RelativeLayout/&gt; &lt;.../&gt; &lt;.../&gt;
  • 我试过了,但它不起作用。我可以点击空白区域,但不能点击文本视图或任何其他小部件
【解决方案2】:

在我看来,因为在你的自定义列表项布局中有 Button 或 ImageButton。

所以有两种解决方案,

  1. 将按钮替换为其他元素,并在 Adapter 代码中移除 onClick 监听器。 这是解决这个问题的简单方法。

  2. 像这样禁用按钮焦点,

android:focusable="false"
android:focusableInTouchMode="false"

请参考ListView setOnItemClickListener not working by adding button

玩得开心。 @.@

【讨论】:

  • 没有为我工作,我不知道为什么。我只在一些 TextViews 旁边使用 ImageButton。已经尝试了此处和引用的链接中提供的所有内容。没有什么工作atm。
【解决方案3】:

这个自定义适配器是为你准备的,你可以同时实现 onclick 和 on item click 监听器......这里我使用了自定义监听器,用于传递所选项目的对象。如果你有任何查询评论...一切顺利

public class CustomAdapter extends ArrayAdapter<Sample> {

public ArrayList<Sample> mlist;
public Context context;
public LayoutInflater inflater;

public CustomAdapter(Context context, int resource, ArrayList<Sample> mlist) {
    super(context, resource);
    this.mlist = mlist;
    this.context = context;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getPosition(Sample item) {
    return super.getPosition(item);
}

@Override
public Sample getItem(int position) {
    return mlist.get(position);
}

@Override
public int getCount() {
    return mlist.size();
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = inflater.inflate(R.layout.listitem, null);
    LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.linearlayoutSample);;
    TextView text1 = (TextView) convertView.findViewById(R.id.item1);
    TextView text2 = (TextView) convertView.findViewById(R.id.item2);
    layout.setBackgroundColor(Color.GREEN);
    text1.setText(mlist.get(position).getListitem1());
    text2.setText(mlist.get(position).getListitem2());
    text2.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // you just put your Logic here And use this custom adapter to
            // load your Data By using this particular custom adapter to
            // your listview

        }
    });
    convertView.setOnClickListener(new ListenerT(Model m) {

        @Override
        public void onClick(View v) {
            Model m = study;

        }
    });
    return convertView;
}
private class ListenerT implements OnClickListener {

    Model study;

    public ListenerT(Model nm) {
        study = nm;
    }

    @Override
    public void onClick(View v) {

    }
}

  }

【讨论】:

    【解决方案4】:

    最好使用 setOnItemClickListener 中的 Log.i() 进行检查,因为您的事件/代码可能没有发生,可能是因为异常。

    因此,如果您的日志打印,但您的代码无法正常工作,则很有可能出现异常,并且它可能不会由于错误处理或尝试捕获而导致应用程序崩溃。还建议将 Log.e 放在 catch 块中(如果存在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多