Android ListView适配器和onClickListener

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

如何为ListView中的每个元素设置onClickListener for按钮? 当我这样做的时候:

   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();
    }
});