2015-12-08 5 views
0

У меня есть список, содержащий строки строк изображения и две кнопки. список загрузок из JSON. И я пытаюсь скрыть кнопку в строке, которую я нажал.Android Listview OnClickListener

Я попробовал его, вызвав кнопку onclicklistener в GetView из BaseAdapter

Проблема

Когда я нажимаю на кнопку в строке. кнопки некоторых других строк скрываются. Я не вижу, чтобы кнопка текущей строки была скрыта.

сообщение Тост показывает правильный текст кнопки, которые я щелкая, как показано в коде ниже

BaseAdapter/GetView

public View getView(final int position, View convertView, ViewGroup parent) { 

final ViewHolder holder; 
newsItem = listData.get(position); 
if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.home_single_image, null); 
    } 
    holder.caption1View = (Button) convertView.findViewById(R.id.btnpos); 

    holder.caption1View.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      HomeListItem newsItem1 = listData.get(position); 
      Toast.makeText(c,newsItem1.getCaption1(),Toast.LENGTH_LONG).show();// shows the correct position button text 
      holder.caption1View.setVisibility(View.GONE); 
     } 
    }); 

    convertView.setTag(holder); 
} 
else { 
    holder = (ViewHolder) convertView.getTag(); 
} 
}  
return convertView; 
} 
+0

Вы не инициализирует 'holder' при первом использовании. –

+0

Я не понял? он инициализирован – Naz141

+0

Я не думаю, что вы вполне понимаете, что такое ViewHolder или как его использовать. Если вы используете ViewHolder, это должен быть отдельный класс, который * содержит представления * каждого элемента списка, который вы создаете. Вы определяете 'onClick()' внутри этого класса, чтобы каждый объект, созданный из класса, имел свои собственные обратные вызовы onClick. – NoChinDeluxe

ответ

0

Вы должны добавить IsVisible переменную класса HomeListItem. Затем добавить эти методы

class HomeListItem { 
... 
private boolean isVisible; 

private boolean isVisible() {return isVisible}; 
private void setIsVisible(boolean b) { isVisible = b;} 

Добавьте этот код в getView() метод

if(HomeListItem.isVisible()){ 
holder.caption1View.setVisibility(View.VISIBLE); 
} else { 
holder.caption1View.setVisibility(View.GONE); 
} 

Внутри вашего щелчка слушателя вы должны сделать

HomeListItem newsItem1 = listData.get(position); 
boolean prevVisibility = newsItem1.isVisible(); 
newsItem1.setIsVisible(!prevVisibility); 
notifyDataSetChanged(); 

Так полный код

public View getView(final int position, View convertView, ViewGroup parent) { 

final ViewHolder holder; 
newsItem = listData.get(position); 
.. 
    if(newsItem.isVisible()){ 
    holder.caption1View.setVisibility(View.VISIBLE); 
    } else { 
    holder.caption1View.setVisibility(View.GONE); 
    } 
holder.caption1View.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      boolean prevVisibility = newsItem.isVisible(); 
      newsItem.setIsVisible(!prevVisibility); 
      notifyDataSetChanged(); 
    } 
}); 

, .. }

Проблема в том, что ListView повторно использует вид, поэтому, когда вы делаете holder.caption1View.setVisibility(View.GONE);, он не будет удален, если вы его не обновите.

0

Это связано с тем, что вид повторного использования адаптера. Это означает, что когда вы устанавливаете caption.setVisibility(View.GONE) в своей строке, вы не только затрагиваете эту строку, но и другую строку, которая будет повторно использовать это представление.

Вам нужно сохранить указатели скрытых кнопок или любой другой метод, который позволит вам решить, должна ли кнопка скрываться для строки.

Затем в конце вашего метода getView добавьте эти строки.

if (buttonShouldBeVisibileForIndex(position)) {//<= this is the method you need to implement 
    holder.caption.setVisible(View.GONE); 
} else { 
    holder.caption.setVisible(View.VISIBLE); 
} 
0

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

public View getView(final int position, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.home_single_image, null); 
      holder = new ViewHolder(); 
      holder.caption1View = (Button) convertView.findViewById(R.id.btnpos); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     newsItem = listData.get(position); 


     holder.caption1View.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       HomeListItem newsItem1 = listData.get(position); 
       Toast.makeText(c, newsItem1.getCaption1(), Toast.LENGTH_LONG).show();// shows the correct position button text 
       holder.caption1View.setVisibility(View.GONE); 
      } 
     }); 

     return convertView; 
    } 
+0

Он делает то же самое, когда нажимает на кнопку, некоторые кнопки других строк получают шкуры – Naz141

+0

add 'holder = new ViewHolder();' внутри условия if. –

+0

проверить мой обновленный ответ –

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