0

У меня есть ListView со строкой, которая имеет ImageButton. Я могу нажать на определенную строку, и это работает: начинается новая ожидаемая активность. Но если я нажимаю на ImageButton, и это элемент внутри строки, ничего не происходит. ImageButton выделяется, но распечатка в onClick из ImageButton не выполняется. Может ли кто-нибудь сказать мне, как я могу это разрешить? Вот мой код:ImageButton внутри строки ListView android не работает

SimpleCursorAdapter menuItems2 = new SimpleCursorAdapter(
      this, R.layout.todo_row, matrixCursor, columnNames, to); 
    ToDolv.setAdapter(menuItems2); 

    ToDolv.setClickable(true); 

    ToDolv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) { 
       final String article = (String) todoIDArray.get(position); 
       globalVariable.setArtID(article); 
       Intent intent1 = new Intent(MainActivity.this, AddToDo.class); 
       startActivity(intent1); 
       finish(); 

       ImageButton chkDone = (ImageButton) findViewById(R.id.chkDone); 
       chkDone.setOnClickListener(new View.OnClickListener() {    
       @Override 
        public void onClick(View v) { 
        // TODO Auto-generated method stub 
        View parentRow = (View) v.getParent(); 
        ListView listView = (ListView) parentRow.getParent(); 
        final int position = listView.getPositionForView(parentRow); 
        System.out.println("I am in position "+ position); 
       } 
      }); 

      } 

     }); 

Вот XML для строки, где ImageButton является:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:padding="6dip" 
android:background = "#5a9b3e" 
android:alpha = "0.7" 
android:descendantFocusability="blocksDescendants" 
> 
    <TextView 
    android:id="@+id/id" 
    android:textColor="#5a9b3e" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 

    /> 
    <TextView 
     android:id="@+id/heading" 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:textColor="#FFFFFF" 
     android:textStyle="bold" 
     android:alpha = "1.0" 
     android:layout_alignParentTop="true" 
     android:ellipsize="marquee" 
     android:singleLine="false" 
     android:textSize="12sp" 
     /> 


    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:padding="2dp" 
     android:layout_toRightOf="@+id/heading" 
     android:layout_toEndOf="@+id/heading" 

     /> 

    <ImageView 
     android:id="@+id/lights" 
     android:layout_width= "20dp" 
     android:layout_height="20dp" 
     android:padding="2dp" 
     android:layout_toRightOf="@+id/icon" 
     android:layout_toEndOf="@+id/icon" 
     /> 

    <ImageButton 
    android:id="@+id/chkDone" 
    android:layout_width="20dp" 
    android:layout_height="20dp" 
    android:padding="0dp" 
    android:background="?android:attr/listChoiceBackgroundIndicator" 
    android:layout_toRightOf="@+id/lights" 
    android:layout_toEndOf="@+id/lights" 
    android:src ="@drawable/checkbox" 
    android:scaleType="fitXY" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    /> 
    <TextView 
     android:id="@+id/date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FFFFFF" 
     android:textStyle="bold" 
     android:alpha = "1.0" 
     android:layout_marginStart="2sp" 
     android:layout_marginLeft="2sp" 
     android:layout_marginTop="2sp" 
     android:textSize="12sp" 
     android:layout_toRightOf="@+id/chkDone" 
     android:layout_toEndOf="@+id/chkDone"/> 
</RelativeLayout> 

Большое спасибо!

EDIT

После предложения я создал пользовательский класс адаптера, чтобы показать строку. Так что я изменил код следующим образом: Основная деятельность в настоящее время имеет следующие строки кода:

 ListView yourListView = (ListView) findViewById(R.id.list); 
     SimpleCursorAdapter menuItems2 = new SimpleCursorAdapter(
      this, R.layout.todo_row, matrixCursor, columnNames, to); 

     CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, R.layout.todo_row, menuItems2); 
     yourListView .setAdapter(customAdapter); 

И CustomListViewAdapter Похоже:

public class CustomListViewAdapter extends ArrayAdapter<RowItem> { 
Context context; 
public CustomListViewAdapter(Context context, int resourceId, 
     SimpleCursorAdapter menuItems2) { 
    super(context, resourceId); 
    this.context = context; 
    System.out.println("I am in the custom Adapter class "+ context); 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    System.out.println("This is the get view"); 
    View row = convertView; 
    if (row == null) { 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = mInflater.inflate(R.layout.todo_row, parent, false); 
    } 

    ImageButton chkDone = (ImageButton) row.findViewById(R.id.chkDone); 
    chkDone.setOnClickListener(new View.OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       View parentRow = (View) v.getParent(); 
       ListView listView = (ListView) parentRow.getParent(); 
       final int position = listView.getPositionForView(parentRow); 
       System.out.println("I am in position "+ position); 
      } 
    }); 

    return row; 
} 
} 

XML-это то же самое.

Он компилируется, но он ничего не делает, и он даже не показывает строку сейчас ... Дайте мне знать, если вам нужно, чтобы я опубликовал код, который создает матрицуCursor.

Большое спасибо, очень ценится.

+0

Вы устанавливаете кнопку прослушивания нажатием кнопки только при нажатии этой строки (потому что вы вызываете ее из 'ToDolv.setOnItemClickListener', которая не будет работать. Вам нужно взглянуть на создание пользовательского адаптера для вашего списка и настройку вашего события click для вашего изображения. Эта ссылка может быть полезной http://stackoverflow.com/questions/8166497/custom-adapter-for-list-view – Dreagen

+0

Опубликовать свой класс адаптера. – Raghavendra

+0

Он использует 'SimpleCursorAdapter', он еще не создал пользовательский адаптер для списка, который является главной проблемой – Dreagen

ответ

1

Вам нужно создать пользовательский адаптер, который принимает список объектов, которые вы можете использовать, чтобы построить свой список.

Вам необходимо создать класс, который содержит информацию, необходимую в вашем списке.Из того, что вы сказали что-то вроде этого:

public class RowItem { 

    private String _columnName; 
    private Drawable _drawable; 

    public RowItem(String columnName, Drawable drawable) { 
     _columnName = columnName; 
     _drawable = drawable; 
    } 

    public String getColumnName() { 
     return _columnName; 
    } 

    public Drawable getDrawable() { 
     return _drawable; 
    } 
} 

Затем создайте эти объекты из предметов, которые вы хотите в вашем списке

ArrayList<RowItem> rowItems = new ArrayList<>(); 

//Create a number of row items and add them to your list 
RowItem myItem1 = new RowItem("String I want for column name", myDrawable); 
rowItems.add(myItem1); 

После создания списка RowItem объектов создать свой собственный адаптер, как это :

CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, R.layout.todo_row, rowItems); 

Затем вы можете передать список объектов RowItem в пользовательский адаптер через это застройщик (как вы пытались сделать ранее):

public class CustomListViewAdapter extends ArrayAdapter<RowItem> { 

Context context; 
ArrayList<RowItem> _rowItems; 

public CustomListViewAdapter(Context context, int resourceId, 
     ArrayList<RowItem> rowItems) { 
    super(context, resourceId); 
    this.context = context; 
    _rowItems = rowItems; 
    System.out.println("I am in the custom Adapter class "+ context); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    System.out.println("This is the get view"); 
    View row = convertView; 
    RowItem item = _rowItems.get(position); 

    // you can now get your string and drawable from the item 
    // which you can use however you want in your list 
    String columnName = rowItem.getColumnName(); 
    Drawable drawable = rowItem.getDrawable(); 
    if (row == null) { 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = mInflater.inflate(R.layout.todo_row, parent, false); 

    } 

    ImageButton chkDone = (ImageButton) row.findViewById(R.id.chkDone); 
    chkDone.setOnClickListener(new View.OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       View parentRow = (View) v.getParent(); 
       ListView listView = (ListView) parentRow.getParent(); 
       final int position = listView.getPositionForView(parentRow); 
       System.out.println("I am in position "+ position); 
      } 
    }); 

    return row; 
} 
+0

С информацией у меня есть, это лучший ответ, который я мог бы придумать. Надеюсь, вам будет намного легче для вас – Dreagen

+0

Большое вам спасибо, я очень благодарен вам за помощь. Я поместил ваш код в свои классы. Кажется, все в порядке, за исключением строки _rowItems = rowItems; который ему не нравится. он говорит, что _rowItems не могут быть разрешены переменной. Мне не хватает импорта, чтобы справиться с «_» на переменных? – user3079872

+0

Ваш приветствовать. Похоже, вам не хватает этой строки: 'ArrayList _rowItems = new ArrayList <>();' хотя в моей строке есть опечатка, и это может быть немного короче. Теперь я отредактирую свой ответ – Dreagen

0

попробовать это

ImageButton chkDone = (ImageButton) findViewById(R.id.chkDone); 
chkDone.setClickable(true); 

может он работает для вас

+0

попробовал это уже ... он не работает – user3079872

+0

может быть проблема в том, что .. вы регистрируете ImageButtonClick в ListView Click. , это означает, что ваш клик по изображению не будет регистрироваться, пока вы не нажмете listitem. поэтому попробуйте переместить clickbutton изображения за пределы listitem нажмите – Moinkhan

0

Изменить эту строку. Вы должны позвонить findViewById() в AdapterView, а не в Activity.

ImageButton chkDone = (ImageButton) arg0.findViewById(R.id.chkDone); 

UPDATE Это правильно, так что извините. Вы должны переопределить метод getView() в вашем классе адаптера, который необходимо создать. Должно быть так:

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    View row = convertView; 
    if (row == null) { 
     LayoutInflater mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = mInflater.inflate(R.layout.mylistlayout, parent, false); 
    } 

    ImageButton chkDone = (ImageButton) findViewById(R.id.chkDone); 
    chkDone.setOnClickListener(new View.OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       View parentRow = (View) v.getParent(); 
       ListView listView = (ListView) parentRow.getParent(); 
       final int position = listView.getPositionForView(parentRow); 
       System.out.println("I am in position "+ position); 
      } 
    }); 

    return row; 
} 
+0

спасибо, но ничего не происходит ... – user3079872

+0

спасибо, я создал пользовательский класс адаптера и поместил в него вышеуказанный код. Я борюсь с линией кода, которая вызывает пользовательский адаптер: ListAdapter customAdapter = новый ListAdapter (это, R.layout.itemlistrow, List ); Не уверен, что я должен поставить для Я использую матричный курсор для создания содержимого строки. – user3079872

0

Глядя на ваш код Java, мне кажется, что у вас есть ImageButton «s OnClickListener внутри ListView» s OnItemClickListener .. Таким образом, поставить его вне этого метода, и он должен работать I верить.

EDIT: Попробуйте это:

public View getView(int position, View row, ViewGroup parent) { 
      final ViewHolder holder; 
      if (row == null) { 
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.items_layout, parent, false); 
       holder = new ViewHolder(); 

       holder.chkDone = (ImageButton) row.findViewById(R.id.chkDone); 

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

      // You add all your methods here... 
      holder.chkDone.setOnClickListener(new View.OnClickListener() {    
       @Override 
        public void onClick(View v) { 
        // TODO Auto-generated method stub 
        View parentRow = (View) v.getParent(); 
        ListView listView = (ListView) parentRow.getParent(); 
        final int position = listView.getPositionForView(parentRow); 
        System.out.println("I am in position "+ position); 
       } 
      }); 

     } 
     return(row); 
    } 

    class ViewHolder { 
     ImageButton chkDone; 
    } 
+0

не будет работать, потому что макет, содержащий 'ImageButton', определен внутри' ListView' – Yurets

+0

Почему бы не определить его за пределами 'ListView'' OnItemClickListener'? Я думаю, что это не проблема, попробуйте. –

+0

Отредактировал свой ответ, поэтому попробуйте. –