2017-11-11 22 views
1

私はListViewを使用しました。各アイテムにはTextViewImageViewの2つがあります。ユーザーがリストアイテムをクリックした場合にのみ、2番目の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の項目をクリックすると、2番目のTextViewが表示されるという問題があります。しかし同時に、他の第2のTextViewのいくつかも見ることができます。 リストの最小数がであれば機能しました。私は5つのアイテムを試しました。

誰でも助けてくれますか?ありがとう!

+0

項目をクリックして、2番目のテキストビューを非表示にして位置を使用してください。アダプタクラスをうまく投稿してください。 –

+0

この場合、コードは実行されていますか?もしかしたら – gStephin

+0

私は自分の質問を編集しました。今すぐ参照してください。初めて、明らかに他のものが実行される – Developer

答えて

1

このアプローチが間違っている、あなたは位置をクリック保存し、アダプタのnotifyDataSetChanged()を呼び出す必要があります。これが起こっている

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

ありがとう、それは働いています。もう一つの条件は** 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を使用しているので:
後、getViewメソッドで/非表示の現在位置はこのように、保存されたクリック位置に何かを等しい場合、いくつかのビューを表示するコードを追加します。リストの新しい項目ごとに新しいビューは作成されませんが、古いビューはリサイクルされます。 2番目のテキストビューを消すには、リストアイテムのレイアウトファイルで指定したかもしれませんが、クリックすると表示されます。したがって、2番目のテキストビューを表示させたこのビューをリサイクルすると、2番目のテキストビューがデフォルトで表示されます。あなたの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オブジェクトを作成しましょう。

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. 
} 

ですから、ListItemクラスを観察してきたように、私はあなたの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機能の実装は非常に簡単です。