Android ListView适配器和onClickListener
如何为ListView中的每个元素设置onClickListener for按钮? 当我这样做的时候:Android ListView适配器和onClickListener,android,listview,Android,Listview,如何为ListView中的每个元素设置onClickListener for按钮? 当我这样做的时候: public View getView(final int position, View convertView, ViewGroup parent){ if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Co
public View getView(final int position, View convertView, ViewGroup parent){
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.element, parent, false);
}
mButton = (Button) convertView.findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mButton.setText("Clicked");
}
});
return convertView;
}
当我按下按钮时,我得到以下错误:
android.content.res.Resources$NotFoundException: String resource ID #0x4c
at android.content.res.Resources.getText(Resources.java:286)
at android.widget.TextView.setText(TextView.java:4148)
at the.vizimir.onezone.adapters.PostListViewAdapter$1.onClick(ListViewAdapter.java:119)
at android.view.View.performClick(View.java:4785)
at android.view.View$PerformClick.run(View.java:19858)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
更新:
我没有发现错误,但单击按钮后,文本不是在我按下的元素中变化,而是在其他元素中变化
public class PostListViewAdapter extends ArrayAdapter<Post> {
private List<Post> mPostList;
private Context mContext;
Button mPlusImageButton;
TextView mTextTextView;
public PostListViewAdapter(List<Post> postList, Context context){
super(context, R.layout.post, postList);
mPostList = postList;
mContext = context;
}
public View getView(final int position, View convertView, ViewGroup parent){
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.post, parent, false);
}
mPlusImageButton = (Button) convertView.findViewById(R.id.plusImageButton);
mTextTextView = (TextView) convertView.findViewById(R.id.textTextView);
String mText = mPostList.get(position).getText();
mTextTextView.setText(mText);
int a = position;
mPlusImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPlusImageButton.setText("A");
}
});
return convertView;
}
@Override
public int getCount(){
return mPostList.size();
}
}
公共类PostListViewAdapter扩展了ArrayAdapter{
私人名单;
私有上下文;
按钮mPlusImageButton;
TextView mTextTextView;
公共PostListViewAdapter(列表postList、上下文){
super(context、R.layout.post、postList);
mPostList=postList;
mContext=上下文;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.post,父项,false);
}
mPlusImageButton=(按钮)convertView.findViewById(R.id.plusImage按钮);
mTextTextView=(TextView)convertView.findViewById(R.id.TextView);
字符串mText=mPostList.get(position.getText();
mTextTextView.setText(mText);
INTA=位置;
mPlusImageButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mPlusImageButton.setText(“A”);
}
});
返回视图;
}
@凌驾
public int getCount(){
返回mPostList.size();
}
}
也许您应该尝试使用:
Button thisButton = (Button) v;
如果您完全确定问题是onClick()
因此,我找到了一个时间,并做了一个简单的例子,它是有效的:
MainActivity.class:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
ArrayList<String> items = new ArrayList<String>();
items.add("1");
items.add("2");
items.add("3");
TestAdapter adapter = new TestAdapter(this, R.layout.list_item, R.id.title, items);
listView.setAdapter(adapter);
}
}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView ListView=(ListView)findViewById(R.id.ListView);
ArrayList items=新建ArrayList();
项目。添加(“1”);
项目。添加(“2”);
项目。添加(“3”);
TestAdapter adapter=新的TestAdapter(此,R.layout.list_项,R.id.title,项);
setAdapter(适配器);
}
}
class(我知道我没有使用ViewHolder模式等等,我只是根据您的示例创建了一个类):
公共类TestAdapter扩展了ArrayAdapter{
私人清单项目;
私有上下文;
公共测试适配器(上下文上下文、int资源、int文本视图资源ID、,
(列表项目){
超级(上下文、资源、textViewResourceId、项目);
这个项目=项目;
mContext=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.list_项,父项,false);
}
最终按钮mButton=(按钮)convertView.findViewById(R.id.Button);
TextView mTitle=(TextView)convertView.findViewById(R.id.title);
mTitle.setText(items.get(position));
mButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
mButton.setText(“单击”);
}
});
返回视图;
}
@凌驾
public int getCount(){
返回items.size();
}
}
所以我需要你所有的代码来查看发生了什么
编辑:当然,您在错误的按钮上得到了文本,您需要在getView中创建它们(就像在我的帖子中一样),而不是在适配器类中创建为字段 您不需要使用按钮。
对于列表视图,请仅使用列表项单击。它是一个内置在ListFragment中的方法。否则,请使用listview.setOnItemClickListener();希望有帮助。它们采用参数ListView l、View v、int position、long id确保此布局-->元素有一个带有此id-->按钮的按钮您确定我们正在查看正确的适配器吗
PostListViewAdapter
?是的,为了更好地理解,我更改了名称。您看到消息了吗:android.content.res.Resources$NotFoundException??是的,但是当我注释行mButton.setText时没有错误。如果您想在OnClick中添加此项并执行类似操作:thisButton.setText->它不工作,您会遇到相同的错误吗?然后请尝试其他答案我在上面添加了代码,但当我单击按钮时什么也没有发生,我是否正确地完成了?我想是的,但这是一种奇怪的方式,也许你应该调用adapter.notifyDataSetChanged(),但即使它可以工作,我建议你找到另一种方式我可以找到其他方式完成,但我现在就买,可能在几个小时内,现在就试试这个元素比较复杂,所以我必须使用其他按钮中的一个。但当我添加ListView l时,android studio说其中一个参数是AdapterView
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mButton.setText("clicked");
notifyDataSetChanged();
}
});
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mButton.setText("clicked");
notifyDataSetChanged();
}
});