2017-11-11 140 views
1

我已經使用ListView其中每個項目有兩個TextView和一個ImageView。我只想顯示第二個TextView只有當用戶點擊一個列表項。在列表視圖中隱藏和顯示列表項無法正常工作

我的代碼,

abc.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     MyAdapter.ViewHolder holder= (MyAdapter.ViewHolder) view.getTag(); 
     if (holder.txtSecond.getVisibility() == View.VISIBLE) { 
      holder.txtSecond.setVisibility(View.GONE); 
      holder.image.setRotation(0); 
     } else { 
      holder.txtSecond.setVisibility(View.VISIBLE); 
      holder.image.setRotation(180); 
     } 
    } 
}); 

而且getView功能看起來是這樣的。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.info_listview_items, null); 
     holder = new ViewHolder(); 
     holder.txtFirst = (TextView) convertView.findViewById(R.id.heading); 
     holder.txtSecond = (TextView) convertView.findViewById(R.id.description); 
     holder.image=(ImageView)convertView.findViewById(R.id.arrow); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    HashMap map = list.get(position); 
    holder.txtFirst.setText(map.get("question").toString()); 
    holder.txtSecond.setText(map.get("answer").toString()); 
    return convertView; 
} 

最初第二TextView能見度View.GONE

問題是,當我點擊ListView中的項目時,第二個TextView可見。但同時其他一些第二個TextView也是可見的。 它在列表中有最小數量的項目時起作用。我嘗試了5個項目。

任何人都可以幫助我。謝謝!

+0

請使用位置,同時點擊項目隱藏和顯示第二個textview,你可以請張貼你的適配器類嗎? –

+0

在這種情況下代碼正在執行..?如果還是 – gStephin

+0

我已編輯我的問題,請現在參考。第一次,其他人顯然會執行 – Developer

回答

1

這種做法是不對的,你應該保存位置點擊,你的適配器上調用notifyDataSetChanged()。
後,在getView添加代碼,這將隱藏/如果當前位置等於保存的點擊位置,像這樣顯示的一些看法:

if (position == clickedPosition) { 
       holder.txtSecond.setVisibility(View.GONE); 
       holder.image.setRotation(0); 
} else { 
       holder.txtSecond.setVisibility(View.VISIBLE); 
       holder.image.setRotation(180); 
} 
+0

非常感謝,它是working.and另一個條件需要是** holder.txtSecond.getVisibility()== View.GONE ** if()。 – Developer

0

你可以使用它作爲..

abc.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    View sec_tv = view.findViewById(R.id.your_second_tv_id); 
    View image_view = view.findViewById(R.id.your_img_view); 

      if (sec_tv.getVisibility() == View.VISIBLE) { 
       sec_tv.setVisibility(View.GONE); 
       image_view.setRotation(0); 
       } 
      else { 
       sec_tv.setVisibility(View.VISIBLE); 
       image_view.setRotation(180); 
       } 
      } 
     }); 
+0

我試過你的答案。但沒有改變:( – Developer

0

這是發生,因爲你使用的是ViewHolder。不會爲列表中的每個新項目創建新視圖,但會回收舊視圖。你可能已經在你的列表項目佈局文件中指定了第二個textview消失了,但點擊後你可以看到它。因此,如果您已使第二個文本視圖可見的此視圖被回收,則默認情況下,您的第二個文本視圖將可見。

爲了解決這個問題,你可以添加下面一行到你的getView功能:

holder.txtSecond.setVisibility(View.GONE);

但確實知道它會做什麼,因爲它可能會產生一些其他意想不到的行爲。

1

我不知道從哪裏開始。你的適配器有很多問題。讓我們重新編碼你的ActivityAdapter

因此,從我的理解中,您試圖在ListView中顯示一堆問題,然後點擊ListView中的問題時,您想揭示該問題的答案。因此,您將問題和答案保留在同一張地圖上,因爲我看到您正在使用以下地圖設置TextView的文字。這不是一個很好的設計來滿足你的目的。

holder.txtFirst.setText(map.get("question").toString()); 
holder.txtSecond.setText(map.get("answer").toString()); 

現在,我想建議保留一個對象數組,你想顯示爲你的列表項目。首先讓我們先製作一個ListItem對象。正如您所觀察到的ListItem

public class ListItem { 
    public String question; 
    public String answer; 
    public boolean showAnswer = false; // Set the default value to false as at the beginning the answers will be hidden. 
} 

所以,我保持一個對象來填充你的ListView您的每個列表項。此外,我保留一個布爾標誌showAnswer以保持您的答案的可見性跟蹤被顯示與否。

現在將一個ListItem對象的數組傳遞給您的適配器,並像這樣實現您的onClickListener。您只需將所選項目的showAnswer標誌設置爲true即可。

abc.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     if(listItemArray[position].showAnswer == false) { 
      listItemArray[position].showAnswer = true; 
      notifyDataSetChanged(); 
     } 
    } 
}); 

現在您的getView函數的實現相當簡單。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = activity.getLayoutInflater(); 
    // .. Other code 

    // HashMap map = list.get(position); 
    // holder.txtFirst.setText(map.get("question").toString()); 
    // holder.txtSecond.setText(map.get("answer").toString()); 

    ListItem listItem = list[position]; 
    holder.txtFirst.setText(listItem.question); 
    holder.txtSecond.setText(listItem.answer); 

    if (listItem.showAnswer == true) holder.txtSecond.setVisibility(View.VISIBLE); 
    else holder.txtSecond.setVisibility(View.GONE); 
    return convertView; 
}