onclick 按钮在列表视图中不起作用
Posted
技术标签:
【中文标题】onclick 按钮在列表视图中不起作用【英文标题】:onclick button is not working in listview 【发布时间】:2012-09-19 06:39:11 【问题描述】:我的项目包含 listView(homelistView),其中包含 button(btnList)。
当我点击 button(btnList) 时,它必须转到另一个 Activity。我尝试了很多,但我没有找到一个很好的例子。
请给我一个很好的例子。
下面是我的代码:
这是我的列表视图包含按钮。单击按钮时,它必须转到其他活动
--------------------------------A--
text text button(btnList) B
--------------------------------C---
text text BUTTON(btnList) D
--------------------------------E--
homempleb.xml
在我在 xml 中使用此代码之前。根据下面的代码,按钮列表对我来说很好
<ListView
android:id="@+id/homelistView"
android:layout_
android:layout_
android:layout_weight="1.04"
android:dividerHeight="0dip" >
</ListView>
EfficientAdapter.java
public EfficientAdapter(Context context)
mInflater = LayoutInflater.from(context);
this.context=context;
In your ViewHolder class you need to add `Button btnList.`
holder.btnList.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
Intent next=new Intent(context, SeviceDetails.class);
context.startActivity(next);
);
homempleb.xml
目前我在我的列表视图中添加了滚动索引并更改了代码如下.. Listbutton 现在不适合我.. 请帮助我你可以在 EfficientAdapter.JAVA 中查看快速参考代码-----> getview方法--->holder.btnList.
<com.woozzu.android.widget.IndexableListView
android:id="@+id/homelistView"
android:layout_
android:layout_
android:layout_weight="1.04"
android:dividerHeight="0dip" >
</com.woozzu.android.widget.IndexableListView>
MainActivity.java
public class MainActivity extends Activity implements
SearchView.OnQueryTextListener, SearchView.OnCloseListener
private ListView listView;
// private IndexableListView listView;
private SearchView search;
EfficientAdapter objectAdapter;
// EfficientAdapter2 objectAdapter1;
int textlength = 0;
private CheckBox checkStat, checkRoutine, checkTat;
private ArrayList<Patient> patientListArray;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.homempleb);
Log.i("scan", " txtScanResult ");
ActionItem nextItem = new ActionItem();
final QuickAction quickAction = new QuickAction(this,
QuickAction.VERTICAL);
quickAction.addActionItem(nextItem);
quickAction.setOnDismissListener(new QuickAction.OnDismissListener()
@Override
public void onDismiss()
Toast.makeText(getApplicationContext(), "Dismissed",
Toast.LENGTH_SHORT).show();
);
search = (SearchView) findViewById(R.id.searchView1);
search.setIconifiedByDefault(false);
search.setOnQueryTextListener(this);
search.setOnCloseListener(this);
search.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
quickAction.show(v);
);
checkStat = (CheckBox) findViewById(R.id.checkBoxStat);
checkRoutine = (CheckBox) findViewById(R.id.checkBoxRoutine);
checkTat = (CheckBox) findViewById(R.id.checkBoxTat);
checkStat.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
if (((CheckBox) v).isChecked())
checkStat.setChecked(true);
Toast.makeText(MainActivity.this, "STAT",
Toast.LENGTH_SHORT).show();
checkRoutine.setChecked(false);
checkTat.setChecked(false);
);
checkRoutine.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
if (((CheckBox) v).isChecked())
checkRoutine.setChecked(true);
Toast.makeText(MainActivity.this, "ROUTINE",
Toast.LENGTH_SHORT).show();
checkStat.setChecked(false);
checkTat.setChecked(false);
);
checkTat.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
if (((CheckBox) v).isChecked())
checkTat.setChecked(true);
Toast.makeText(MainActivity.this, "TAT Effeciency",
Toast.LENGTH_SHORT).show();
checkRoutine.setChecked(false);
checkStat.setChecked(false);
);
// listView = (IndexableListView) findViewById(R.id.homelistView);
listView = (ListView) findViewById(R.id.homelistView);
listView.setTextFilterEnabled(true);
listView.setFastScrollEnabled(true);
listView.setFastScrollAlwaysVisible(true);
objectAdapter = new EfficientAdapter(this);
listView.setAdapter(objectAdapter);
Button refreshButton = (Button) findViewById(R.id.refreshButton);
refreshButton.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// objectAdapter1 = new EfficientAdapter2(MainActivity.this);
objectAdapter = new EfficientAdapter(MainActivity.this);// adapter
// with
// new
// data
listView.setAdapter(objectAdapter);
Log.i("notifyDataSetChanged", "data updated");
// objectAdapter1.notifyDataSetChanged();
objectAdapter.notifyDataSetChanged();
);
@Override
public boolean onClose()
return false;
@Override
public boolean onQueryTextChange(String newText)
return false;
@Override
public boolean onQueryTextSubmit(String query)
return false;
EfficientAdapter.JAVA
public class EfficientAdapter extends BaseAdapter implements SectionIndexer
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ArrayList<Patient> patientListArray;
private LayoutInflater mInflater;
private Context context;
ViewHolder holder;
public EfficientAdapter(Context context)
mInflater = LayoutInflater.from(context);
this.context = context;
String patientListJson = CountriesList.jsonData;
JSONObject jssson;
try
jssson = new JSONObject(patientListJson);
patientListJson = jssson.getString("PostPatientDetailResult");
catch (JSONException e)
e.printStackTrace();
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray Jarray = parser.parse(patientListJson).getAsJsonArray();
patientListArray = new ArrayList<Patient>();
for (JsonElement obj : Jarray)
Patient patientList = gson.fromJson(obj, Patient.class);
patientListArray.add(patientList);
Log.i("patientList", patientListJson);
/**
* sorting the patientListArray data
*/
public void sortMyData()
// sorting the patientListArray data
Collections.sort(patientListArray, new Comparator<Object>()
@Override
public int compare(Object o1, Object o2)
Patient p1 = (Patient) o1;
Patient p2 = (Patient) o2;
return p1.getName().compareToIgnoreCase(p2.getName());
);
public int getCount()
return patientListArray.size();
public Object getItem(int position)
return position;
public long getItemId(int position)
return position;
public View getView(int position, View convertView, ViewGroup parent)
if (convertView == null)
convertView = mInflater.inflate(R.layout.homemplebrowview, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.name);
holder.text2 = (TextView) convertView.findViewById(R.id.mrn);
holder.text3 = (TextView) convertView.findViewById(R.id.date);
holder.text4 = (TextView) convertView.findViewById(R.id.age);
holder.text5 = (TextView) convertView.findViewById(R.id.gender);
holder.text6 = (TextView) convertView.findViewById(R.id.wardno);
holder.text7 = (TextView) convertView.findViewById(R.id.roomno);
holder.text8 = (TextView) convertView.findViewById(R.id.bedno);
holder.btnList = (Button) convertView.findViewById(R.id.listbutton);
convertView.setTag(holder);
else
holder = (ViewHolder) convertView.getTag();
holder.text1.setText(Util.formatN2H(patientListArray.get(position)
.getName()));
holder.text2.setText(patientListArray.get(position).getMrnNumber());
holder.text3.setText(Util.formatN2H(patientListArray.get(position)
.getRoom()));
holder.text4.setText(Util.formatN2H(patientListArray.get(position)
.getAge()));
holder.text5.setText(Util.formatN2H(patientListArray.get(position)
.getGender()));
holder.text6.setText(Util.formatN2H(patientListArray.get(position)
.getWard()));
holder.text7.setText(Util.formatN2H(patientListArray.get(position)
.getRoom()));
holder.text8.setText(Util.formatN2H(patientListArray.get(position)
.getBed()));
holder.btnList.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
Toast.makeText(context, "STAT", Toast.LENGTH_SHORT).show();
Intent next = new Intent(context, Home.class);
Log.i("next23", "next");
context.startActivity(next);
);
return convertView;
static class ViewHolder
public Button btnList;
public TextView text8;
public TextView text7;
public TextView text6;
public TextView text5;
public TextView text4;
public TextView text1;
public TextView text2;
public TextView text3;
@Override
public void notifyDataSetChanged()
super.notifyDataSetChanged();
public int getPositionForSection(int section)
// sorting the patientListArray data
sortMyData();
// If there is no item for current section, previous section will be
// selected
for (int i = section; i >= 0; i--)
for (int j = 0; j < getCount(); j++)
if (i == 0)
// For numeric section
for (int k = 0; k <= 9; k++)
if (StringMatcher.match(
String.valueOf(patientListArray.get(j)
.getName().charAt(0)),
String.valueOf(k)))
return j;
else
if (StringMatcher.match(
String.valueOf(patientListArray.get(j).getName()
.charAt(0)),
String.valueOf(mSections.charAt(i))))
return j;
return 0;
public int getSectionForPosition(int position)
return 0;
public Object[] getSections()
String[] sections = new String[mSections.length()];
for (int i = 0; i < mSections.length(); i++)
sections[i] = String.valueOf(mSections.charAt(i));
return sections;
【问题讨论】:
同时打印 logcat 错误信息 @MohitVerma no verma 根据 MoshErsan 代码尝试和编辑的 d 代码无法正常工作,但没有使用它在 onclick 本身不工作.. 没有显示任何错误,log,toast 也在 logcat 中。 您是否尝试过更改您的转换视图? 我不知道错误是什么.. ho..k..fine 谢谢verma..我会试试.. 【参考方案1】:问题出在 onInterceptTouchEvent 方法中。您正在使用来自 woozzu 的IndexableListView,并且此类覆盖 onInterceptTouchEvent 以返回 true。这意味着 IndexableListView 总是从您孩子的视图中窃取触摸事件,以便将其提供给IndexScroller。如果您输入以下条件而不是返回 true,则可以更改此行为:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
if (mScroller != null && mScroller.contains(ev.getX(), ev.getY()))
return true;
return super.onInterceptTouchEvent(ev);
这种方式只会使用与 IndexScroller 交互的事件。其他事件将传播到孩子的视图中,并且您的按钮将是可点击的。
【讨论】:
【参考方案2】:在你的 Efficient 适配器类中声明 ViewHolder holder
在 getView 方法之外
并按照 MoshErsan 所说的去做。
也改变你的
convertView = mInflater.inflate(R.layout.homemplebrowview, null);
到
convertView = mInflater.inflate(R.layout.homemplebrowview, parent,false);
【讨论】:
hi verma 按照 MoshErsan 代码尝试和编辑了 d 代码,但没有用它不能在 onclick 本身上工作.. 在 logcat 中也没有显示任何错误.. 经过 2 天的努力,我终于得到了 80% 的输出清楚地检查此链接***.com/questions/12650219/button-in-listview-adapter 问题在 xml 中..【参考方案3】:在您的适配器中,只需移动
holder.btnList.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
Toast.makeText(context, "STAT", Toast.LENGTH_SHORT).show();
Intent next = new Intent(context, Home.class);
Log.i("next23", "next");
context.startActivity(next);
);
就在return convertView;
之前
每次适配器返回视图时都需要设置监听器。
【讨论】:
我也试过了,但它不起作用。如果在 xml 中添加 它对我来说工作正常..但是我将 d 代码更改为以上是关于onclick 按钮在列表视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
按钮 onClick 在反应显示中不起作用 FindDOMNode 在 StrictMode 中已弃用
按钮 onClick 事件侦听器在 Electron 应用程序中不起作用
除非您离开应用程序并返回,否则按钮 onclick 事件在 iOS 中不起作用,然后它就起作用了