ListView setOnItemClickListener 在自定义列表视图中不起作用

问题描述 投票:0回答:5

我有一个列表视图,每行有两个文本视图和一个编辑文本,列表视图 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>

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

提前致谢

android android-layout android-listview
5个回答
12
投票

设置这些属性

 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>

6
投票

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

所以有两种解决方案,

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

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

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

请参考此ListView setOnItemClickListener 无法通过添加按钮来工作

玩得开心。 @.@


0
投票

这个自定义适配器适合您,您还可以实现 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) {

    }
}

  }

0
投票

最好使用

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

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


0
投票

问题出在图像按钮上。我将其更改为图像视图并解决了问题。为了检查此错误,设置图像按钮可见性消失,然后它将工作。我通过将图像按钮更改为图像视图解决了此问题

© www.soinside.com 2019 - 2024. All rights reserved.