5

我想设置一个自定义适配器和列表视图设置onItemClickListener。似乎无法让侦听器工作。我认为我没有正确设置它。任何帮助表示赞赏。非常感谢。onItemClickListener与自定义适配器和列表视图

适配器:

public class ModuleAdapter extends ArrayAdapter<Module> { 

Context context; 
int layoutResourceId; 
Module data[]; 

public ModuleAdapter(Context context, int layoutResourceId, 
     Module data[]) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ModuleHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ModuleHolder(); 
     holder.modJapTitle = (TextView)row.findViewById(R.id.moduleJapTitle); 
     holder.modEngTitle = (TextView)row.findViewById(R.id.moduleEngTitle); 
     holder.modComp = (TextView)row.findViewById(R.id.moduleCompletion); 
     holder.modRating = (RatingBar)row.findViewById(R.id.moduleScore); 

     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ModuleHolder)row.getTag(); 
    } 

    Module module = data[position]; 
    holder.modJapTitle.setText(module.moduleJapaneseTitle); 
    holder.modEngTitle.setText(module.moduleEnglishTitle); 
    holder.modComp.setText(module.moduleCompletionRate); 
    holder.modRating.setRating(module.moduleRating); 

    return row; 
} 

static class ModuleHolder 
{ 
    TextView modEngTitle; 
    TextView modJapTitle; 
    TextView modComp; 
    RatingBar modRating; 
} 

}

实现:

ModuleAdapter moduleData = new ModuleAdapter(this, R.layout.module_box_item, module_data); 
    ListView listView1 = (ListView)findViewById(R.id.moduleListContainer); 
    listView1.setAdapter(moduleData); 
    listView1.setCacheColorHint(Color.TRANSPARENT); 
    listView1.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.v("Module Item Trigger", "Module item was triggered"); 
      Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

而且这里是在列表中的单品之一的XML布局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/moduleBox" 
android:id="@+id/moduleBoxSingle" > 

<TextView 
    android:id="@+id/moduleJapTitle" 
    style="@style/moduleTitleJap" /> 
<TextView 
    android:id="@+id/moduleCompletion" 
    android:layout_above="@+id/moduleSepartor" 
    style="@style/moduleCompletion" /> 
<View 
    android:id="@+id/moduleSepartor" 
    android:layout_below="@+id/moduleJapTitle" 
    style="@style/moduleSeperator" /> 
<TextView 
    android:id="@+id/moduleEngTitle" 
    android:layout_below="@+id/moduleSepartor" 
    style="@style/moduleTitleEng" /> 
<RatingBar 
    android:id="@+id/moduleScore" 
    android:layout_below="@+id/moduleSepartor" 
    style="@style/moduleRating" 
    android:layout_alignParentRight="true" /> 

</RelativeLayout> 
+1

一切都显得好看加入这一行。也许这是一个UI问题?你为什么不写信给logcat而不是弹出一个Toast。只是为了100%确定你的听众没有被调用。 –

+1

你可以在这里发布你的布局xml吗? – rajpara

+1

你好,谢谢你的回复。我已经添加到写入Logcat的行中。而且我还添加了用于每个单个列表项的XML布局。 – mwrazam

回答

16

我认为这是类似的问题,如this

添加下面的代码到你的TextView在XML

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

,然后再试一次。

+3

这个伎俩!非常感谢。大量的头发保存。 :) – mwrazam

4

首先为这一点,你必须impliments类具有以下处理

implements OnItemClickListener 

然后添加一个函数如下onItemClick()

public void onItemClick(AdapterView parent, View v, int position, long id) { 
    Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show(); 
} 

视为给定的,当我们设置数据适配器的listview然后添加下面一行代码

itemlist.setOnItemClickListener(this); 

希望这会为你工作...

+1

你好,谢谢你的回复。我试了一下,但结果与我上面的原始代码相同。也许别的东西是错的,我的代码不会触发该监听器? – mwrazam

1

尝试......

ListView lv = (ListView)findViewById(R.id.Your_ListView_Id); // If it extends Activity. 

OR

ListView lv = getListView; // If it extends ListActivity. 
lv.setOnItemClickListener(this); // Make the Activity implement onItemClickListener 
lv.setAdapter(your_adapter); 

编辑部分:在吐司的背景下作出更改,并添加SYSOUT

//将处理事件的方法。

public void onItemClick(AdapterView parent, View v, int position, long id{ 
    Toast.makeText(Your_Activity_Name.this, "hello", Toast.LENGTH_SHORT).show(); 
    System.out.println("This is a Test"); 
} 

CHECK登录..是否SYSOUT STATEMENT获取打印!!

+1

你好,谢谢你的留言。不幸的是,这也不起作用。吐司消息仍然没有开火。 – mwrazam

+1

只是一分钟.......试试这个.. Toast.make Toast.makeText(Your_Activity_Name.this,“你好”,Toast.LENGTH_SHORT).show(); –

相关问题