1

В основном все, что я пытаюсь сделать, это показать кнопку в строке, когда выбрана строка. Я перепробовал много способов, и все они, кажется, в том числе работы ниже одного ... Я получаю ImageView но называть setVisibility() на нем делает ничего:Получить представление из строки ListView

ListFragment

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
    setSellButton(); 
} 

public View getViewForPosition(int position){ 
    int relativePos = position - listview.getFirstVisiblePosition(); 
    if(relativePos < 0 || relativePos > listview.getChildCount()){ 
     return null; 
    } 
    return listview.getChildAt(relativePos); 
} 

public void setSellButton() { 
    View x = getViewForPosition(Constants.lastSelection); 
    ImageView y = (ImageView)x.findViewById(R.id.ivSell); 
    y.setVisibility(View.VISIBLE); 
} 

Нет ошибок и отладки показывает, что все правильно в setSellButton(), но setVisibility() никогда не работает. Это что-то, что я могу сделать только в адаптере? Благодаря!



Edit: Row Layout XML в соответствии с просьбой

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="60dp" 
    android:orientation="horizontal" 
    android:gravity="center_vertical" 
    android:background="@drawable/thelist" 
    > 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/ivStar" 
     android:src="@drawable/liststar" 
     android:layout_weight="1" /> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center_vertical" 
     android:layout_weight="10"> 

     <TextView 
      android:id="@+id/label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="15sp" 
      android:textStyle="bold"> 
     </TextView> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tvValue" 
     android:textSize="13sp" /> 

</LinearLayout> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/coin" 
     android:id="@+id/ivSell" 
     android:visibility="invisible" /> 

</LinearLayout> 

Edit: адаптер

public class InventoryAdapter extends ArrayAdapter<Integer> { 

    private final Context context; 
    private final ArrayList<String> names; 
    private final ArrayList<Integer> stock; 
    LayoutInflater inflater; 
    View rowView; 
    String stockText; 
    TextView textView; 
    TextView textView2; 
    ImageView iv; 

    public InventoryAdapter(Context context, ArrayList<String> names, ArrayList<Integer> stock) { 
     super(context, R.layout.inv_rowlayout, stock); 
     this.context = context; 
     this.names = names; 
     this.stock = stock; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(R.layout.inv_rowlayout, parent, false); 

     String stockNumber = stock.get(position).toString(); 
     final String name = names.get(position); 

     textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names.get(position)); 
     textView2 = (TextView) rowView.findViewById(R.id.tvValue); 
     textView2.setText(stockNumber); 
     iv = (ImageView)rowView.findViewById(R.id.ivSell); 

     return rowView; 
    } 

} 
+0

Подождите. Вы хотите показать кнопку «Button» в строке или на другой части вашего макета? Не могли бы вы также отправить свой «xml»? – Mauker

+0

@Mauker добавлен к вопросу. – zngb

+0

Попробуйте мой ответ, сэр. Это должно делать свое дело. – Mauker

ответ

1

Хорошо. Прежде всего позвольте мне адаптировать строку xml. Лучше использовать RelativeLayout вместо LinearLayout. Это более гибко.

row_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:background="@drawable/thelist" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:minHeight="@dimen/listView_minHeight"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/ivStar" 
     android:contentDescription="@string/list_item_image_desc" 
     android:layout_gravity="center_vertical" 
     android:layout_centerVertical="true" 
     android:src="@drawable/liststar" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/ivStar" 
     android:layout_toEndOf="@+id/ivStar" 
     android:layout_alignParentTop="true" 
     android:id="@+id/label" 
     android:text="New Text" 
     android:textSize="15sp" 
     android:layout_marginLeft="12dp" 
     android:layout_marginRight="12dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" 
     android:textSize="13sp" 
     android:id="@+id/tvValue" 
     android:layout_below="@+id/label" 
     android:layout_toRightOf="@+id/ivStar" 
     android:layout_toEndOf="@+id/ivStar" 
     android:layout_marginLeft="12dp" 
     android:layout_marginRight="12dp" /> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/ivSell" 
     android:src="@drawable/coin" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_centerVertical="true" 
     android:visibility="invisible" /> 

</RelativeLayout> 

Вы, вероятно, подклассов BaseAdapter. Что вам нужно сделать, так это создать метод для изменения видимости вашего ImageView. Затем, когда вы нажмете свой предмет, вы можете получить adapter и вызвать этот метод.

CustomAdapter.java

public class CustomAdapter extends BaseAdapter { 

    private Context context_; 
    private ArrayList<YourDataHolder> items; 
    private YourDataHolder lastHolder = null; 

    private final String LOG_TAG = CustomAdapter.class.getSimpleName(); 

    public CustomAdapter(Context context, ArrayList<YourDataHolder> items) { 
     this.context_ = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return items.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if (convertView == null) { 
      LayoutInflater mInflater = (LayoutInflater) 
        context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

      convertView = mInflater.inflate(R.layout.row_layout, null); 
     } 

     final TextView tv_label = (TextView) convertView.findViewById(R.id.label); 
     final TextView tv_value = (TextView) convertView.findViewById(R.id.tvValue); 
     final ImageView iv_star = (ImageView) convertView.findViewById(R.id.ivSell); 

     YourDataHolder holder = items.get(position); 

     tv_label.setText(holder.getLabel()); 
     tv_value.setText(holder.getValue()); 

     if (holder.isImageVisible() && iv_star.getVisibility() == ImageView.INVISIBLE) { 
      iv_star.setVisibility(ImageView.VISIBLE); 
     } 
     else if (iv_star.getVisibility() == ImageView.VISIBLE) { 
      iv_star.setVisibility(ImageView.INVISIBLE); 
     } 


     return convertView; 
    } 

    public void onItemSelect(int position) { 
     if (position < items.size()) { 
      YourDataHolder holder = items.get(position); 

      holder.setVisibility(true); 

      if (lastHolder != null) { 
       lastHolder.setVisibility(false); 
      } 

      lastHolder = holder; 
     } 
    } 
} 

Предполагая, что вы используете держатель данных как этот:

YourDataHolder.java

public class YourDataHolder { 
    private String label; 
    private String value; 
    private boolean isVisible; 

    public YourDataHolder(String label, String value) { 
     this.label = label; 
     this.value = value; 
     isVisible = false; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public String getValue() { 
     return value; 
    } 

    public boolean getVisibility() { 
     return isVisible; 
    } 

    public void setVisibility(boolean isVisible) { 
     this.isVisible = isVisible; 
    } 
} 

И тогда, на ваш onItemClick() , сделайте волшебство.

YourFragment.java

private CustomAdapter adapter; 

// Rest of the Fragment. Where you create the adapter, and assign it to the ListView. 

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
    adapter.onItemSelect(position); 
    adapter.notifyDataSetChanged(); 
} 
+0

Спасибо за этот ответ. Я попытался реализовать это, но не повезло из-за проблем с отправкой списков, которые не находятся в YourDataHolder (для меня это совсем не так). Я все еще работаю над этим и пытаюсь понять его больше и заставить его работать, просто хотел поблагодарить вас за вклад. Кроме того, я расширяю 'ArrayAdapter ' вместо 'BaseAdapter' для моего CustomAdapter – zngb

+1

Он будет работать с одним из этих адаптеров. Если у вас все еще есть проблемы. Я могу попытаться помочь – Mauker

+0

Я вызываю адаптер как: adapter = new InventoryAdapter (getActivity(), listNames, listMyStock); где 'listNames'' ArrayList ' – zngb

1

Мое предположение, что после щелчка по пункту вас необходимо вызвать метод notifyDataSetChanged для адаптер. Затем отрисуйте кнопку в элементе списка выбранного списка.

+0

Я попытался вызвать 'notifyDataSetChanged()' на адаптере, и это, похоже, не изменило ситуацию. – zngb

+0

Не могли бы вы разместить свой код адаптера? После вызова notifyDataSetChanged следует вызвать метод getView(). Можете ли вы это подтвердить? –

0

Это то, что я сделал бы в адаптере, имея прямой доступ к представлению изображения, облегчит процесс. Я ранее пытался сделать это с уровня списка и не смог выполнить условия, которые у меня были настройки.

Смежные вопросы