Android 获取多视图listItem中单击的视图和正确的数据-使用ListView、CursorAdapter

Android 获取多视图listItem中单击的视图和正确的数据-使用ListView、CursorAdapter,android,onclicklistener,android-cursoradapter,onitemclicklistener,Android,Onclicklistener,Android Cursoradapter,Onitemclicklistener,因此,我有一个用于listview的游标适配器。我希望每个列表项有4个可点击的视图,因为我会有不同的事情发生时,每件事是点击。。。这里不重要 我的问题…是我无法获取所选项目(或行)中的数据以及在该列表项目中单击的视图(1到4) 到目前为止我所尝试的: @Override public void bindView(View v, Context context, Cursor c) { ImageView imPlay = (ImageView) v.findViewById(R.id.

因此,我有一个用于listview的游标适配器。我希望每个列表项有4个可点击的视图,因为我会有不同的事情发生时,每件事是点击。。。这里不重要

我的问题…是我无法获取所选项目(或行)中的数据以及在该列表项目中单击的视图(1到4)

到目前为止我所尝试的:

@Override
public void bindView(View v, Context context, Cursor c) {
    ImageView imPlay = (ImageView) v.findViewById(R.id.row_play_button);
    LinearLayout llFirstHalf = (LinearLayout) v.findViewById(R.id.row_first_half);
    LinearLayout llSecondHalf = (LinearLayout) v.findViewById(R.id.row_second_half);
    CheckBox cbCheck = (CheckBox) v.findViewById(R.id.row_checkbox);

}


public void myOnClick(View v) {
    switch(v.getId()){

    case R.id.row_checkbox:
        //do something
        break;
    case R.id.row_first_half:
        //do something
        break;
    case R.id.row_second_half:
        //do something
        break;
    case R.id.row_play_button:
        //do something
        break;
@Override
public void onItemClick(AdapterView<?> parent, View view, int index, long pos) {
    Log.e("onITEMCLICK",    "index: "+String.valueOf(index));
    Log.e("onITEMCLICK",    "position: "+String.valueOf(pos));
    LinearLayout listItem = (LinearLayout) view;


    String title;
    String date_created;
    String comments;
    String sample_rate;
    String duration;
    String file_size;
    String id;
    String file_url;

    Cursor c = app.rec_adapter.getCursor();
    c.moveToPosition(index);
    title = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_TITLE));
    date_created = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DATE_CREATED));
    comments = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_COMMENTS));
    sample_rate = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_SAMPLE_RATE));
    sample_rate = convertToHumanReadable(sample_rate);
    duration = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DURATION));
    file_size = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_SIZE));
    file_url = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_URL));
    id = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_ROWID));


// find out what section was clicked on the item -- NO SOLUTION
    ImageView imPlay = (ImageView) listItem.findViewById(R.id.row_play_button);
    LinearLayout llFirstHalf = (LinearLayout) listItem.findViewById(R.id.row_first_half);
    LinearLayout llSecondHalf = (LinearLayout) listItem.findViewById(R.id.row_second_half);
    CheckBox cbCheck = (CheckBox) listItem.findViewById(R.id.row_checkbox);



}
  • 当我在光标或适配器中覆盖onClick时,我可以获得视图 成功,但返回该列表项的数据不正确 正确(它只返回列表中第一个条目的数据 无论选择了什么)
  • 因此,我尝试在承载listview的活动中实现onItemClick。当我这么做的时候 我能够从中获得任何一项被选中的数据,但是 我无法从列表项中获取四个可单击区域中的一个
  • 当我尝试使用这两种方法时,onClick会覆盖 CursorAdapter似乎覆盖了 活动,然后我所能做的就是得到正确的观点(第1个,共4个) 已在列表项中选择
  • 也许这些策略中的一个是正确的,我只是没有以正确的方式获取数据或正确地获取视图。无论如何,任何帮助都将不胜感激

    当从我的游标适配器实现onClick时:

    @Override
    public void bindView(View v, Context context, Cursor c) {
        ImageView imPlay = (ImageView) v.findViewById(R.id.row_play_button);
        LinearLayout llFirstHalf = (LinearLayout) v.findViewById(R.id.row_first_half);
        LinearLayout llSecondHalf = (LinearLayout) v.findViewById(R.id.row_second_half);
        CheckBox cbCheck = (CheckBox) v.findViewById(R.id.row_checkbox);
    
    }
    
    
    public void myOnClick(View v) {
        switch(v.getId()){
    
        case R.id.row_checkbox:
            //do something
            break;
        case R.id.row_first_half:
            //do something
            break;
        case R.id.row_second_half:
            //do something
            break;
        case R.id.row_play_button:
            //do something
            break;
    
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int index, long pos) {
        Log.e("onITEMCLICK",    "index: "+String.valueOf(index));
        Log.e("onITEMCLICK",    "position: "+String.valueOf(pos));
        LinearLayout listItem = (LinearLayout) view;
    
    
        String title;
        String date_created;
        String comments;
        String sample_rate;
        String duration;
        String file_size;
        String id;
        String file_url;
    
        Cursor c = app.rec_adapter.getCursor();
        c.moveToPosition(index);
        title = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_TITLE));
        date_created = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DATE_CREATED));
        comments = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_COMMENTS));
        sample_rate = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_SAMPLE_RATE));
        sample_rate = convertToHumanReadable(sample_rate);
        duration = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DURATION));
        file_size = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_SIZE));
        file_url = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_URL));
        id = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_ROWID));
    
    
    // find out what section was clicked on the item -- NO SOLUTION
        ImageView imPlay = (ImageView) listItem.findViewById(R.id.row_play_button);
        LinearLayout llFirstHalf = (LinearLayout) listItem.findViewById(R.id.row_first_half);
        LinearLayout llSecondHalf = (LinearLayout) listItem.findViewById(R.id.row_second_half);
        CheckBox cbCheck = (CheckBox) listItem.findViewById(R.id.row_checkbox);
    
    
    
    }
    
    在MainActivity中实现onItemClick时:

    @Override
    public void bindView(View v, Context context, Cursor c) {
        ImageView imPlay = (ImageView) v.findViewById(R.id.row_play_button);
        LinearLayout llFirstHalf = (LinearLayout) v.findViewById(R.id.row_first_half);
        LinearLayout llSecondHalf = (LinearLayout) v.findViewById(R.id.row_second_half);
        CheckBox cbCheck = (CheckBox) v.findViewById(R.id.row_checkbox);
    
    }
    
    
    public void myOnClick(View v) {
        switch(v.getId()){
    
        case R.id.row_checkbox:
            //do something
            break;
        case R.id.row_first_half:
            //do something
            break;
        case R.id.row_second_half:
            //do something
            break;
        case R.id.row_play_button:
            //do something
            break;
    
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int index, long pos) {
        Log.e("onITEMCLICK",    "index: "+String.valueOf(index));
        Log.e("onITEMCLICK",    "position: "+String.valueOf(pos));
        LinearLayout listItem = (LinearLayout) view;
    
    
        String title;
        String date_created;
        String comments;
        String sample_rate;
        String duration;
        String file_size;
        String id;
        String file_url;
    
        Cursor c = app.rec_adapter.getCursor();
        c.moveToPosition(index);
        title = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_TITLE));
        date_created = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DATE_CREATED));
        comments = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_COMMENTS));
        sample_rate = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_SAMPLE_RATE));
        sample_rate = convertToHumanReadable(sample_rate);
        duration = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_DURATION));
        file_size = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_SIZE));
        file_url = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_FILE_URL));
        id = c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_ROWID));
    
    
    // find out what section was clicked on the item -- NO SOLUTION
        ImageView imPlay = (ImageView) listItem.findViewById(R.id.row_play_button);
        LinearLayout llFirstHalf = (LinearLayout) listItem.findViewById(R.id.row_first_half);
        LinearLayout llSecondHalf = (LinearLayout) listItem.findViewById(R.id.row_second_half);
        CheckBox cbCheck = (CheckBox) listItem.findViewById(R.id.row_checkbox);
    
    
    
    }
    
    @覆盖
    public void onItemClick(AdapterView父视图、视图视图、整数索引、长位置){
    Log.e(“onITEMCLICK”,“index:+String.valueOf(index));
    Log.e(“onITEMCLICK”,“position:”+String.valueOf(pos));
    LinearLayout列表项=(LinearLayout)视图;
    字符串标题;
    创建的字符串日期;
    字符串注释;
    串采样率;
    字符串持续时间;
    字符串文件大小;
    字符串id;
    字符串文件的url;
    游标c=app.rec_adapter.getCursor();
    c、 移动位置(索引);
    title=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_title));
    date_created=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_date_created));
    comments=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_comments));
    sample_rate=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_sample_rate));
    采样率=转换为可读(采样率);
    duration=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_duration));
    file_size=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_file_size));
    file_url=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_file_url));
    id=c.getString(c.getColumnIndexOrThrow(DBAdapter.rKEY_ROWID));
    //找出在项目上单击的部分--无解决方案
    ImageView imPlay=(ImageView)listItem.findViewById(R.id.row\u play\u按钮);
    linerlayout lllastHalf=(linerlayout)listItem.FindView wByd(R.id.row_1;前半部分);
    LinearLayout llSecondHalf=(LinearLayout)listItem.findViewById(R.id.row\u secondhalf);
    复选框cbCheck=(复选框)listItem.findViewById(R.id.row\u复选框);
    }
    
    您有这个
    LinearLayout列表项=(LinearLayout)视图因此您已经使用
    列表项
    进行了初始化。我认为您需要从行项目中获取数据。您已经初始化了视图。那么,获取数据的问题是什么呢?请不要在问题标题前加上Android,底部的标签就足够了。由于您需要查看一行中四个视图上的单击事件,因此不能使用
    onItemClick()
    ,因为在单击整行时会触发该事件。相反,您应该为四个视图(在
    bindView()
    中)设置
    onClick
    侦听器,并将
    游标.getPosition()
    值作为标记传递给它们。通过这种方式,您将知道在
    列表视图中单击此视图的行,以便您可以检索正确的数据。好的,谢谢您的提示。那么对于每个可点击的视图,我将把它的标签设置为当前光标位置?然后,当我想要获取行信息时,我必须执行“pos=view.getTag()”,将光标设置为pos,然后“cursor.getColumnIndexOrThrow()”来获取数据@卢克斯普罗贡问题。。。当我对光标位置执行getTag时,它始终只给我第一个项目的位置。我使用:
    View parent=v.getRootView()
    View vId=(View)parent.findviewbyd(R.id.row\u id);int cursor_pos=(整数)vId.getTag()光标mCursor=this.c;mCursor.moveToPosition(光标位置);'他解决了我自己的问题。而不是使用
    v.getRootView();我需要使用v.getParent()我猜是getRootView();获取Listview布局,然后只获取第一个R.id.row_id视图,它始终是第一项。。。有道理